freebsd-dev/etc/MAKEDEV

1779 lines
38 KiB
Plaintext
Raw Normal View History

#!/bin/sh -
#
# Copyright (c) 1990 The Regents of the University of California.
# All rights reserved.
#
# Written and contributed by W. Jolitz 12/90
#
# Redistribution and use in source and binary forms are permitted provided
# that: (1) source distributions retain this entire copyright notice and
# comment, and (2) distributions including binaries display the following
# acknowledgement: ``This product includes software developed by the
# University of California, Berkeley and its contributors'' in the
# documentation or other materials provided with the distribution and in
# all advertising materials mentioning features or use of this software.
# Neither the name of the University nor the names of its contributors may
# be used to endorse or promote products derived from this software without
# specific prior written permission.
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
# @(#)MAKEDEV 5.2 (Berkeley) 6/22/90
# $FreeBSD$
#
# Device "make" file. Valid arguments:
# all makes all known devices, standard number of units (or close)
# std standard devices
# jail suitable for a jail(8)
# local configuration specific devices
# mach-4 mach4&lites+devices for Mach's XFree86 distribution
# (see http://www.cs.hut.fi/lites.html for more info on LITES)
#
# Tapes:
# wt* QIC-interfaced (e.g. not SCSI) 3M cartridge tape
1998-09-15 10:21:35 +00:00
# sa* SCSI Sequential Access Devices
#
# Disks:
# aac* Adaptec FSA RAID controllers
2000-09-13 05:03:02 +00:00
# aacd* Adaptec FSA RAID
# acd* ATAPI CD-ROM disks
2001-03-06 01:02:23 +00:00
# amrd* AMI MegaRAID
# cd* SCSI CD-ROM disks
# da* SCSI Direct Access Devices
# fd* floppy disk drives (3 1/2", 5 1/4")
# fla* M-Systems DiskOnChip
# idad* Compaq Smart-2 RAID arrays
# mcd* Mitsumi CD-ROM disks
# md* Memory (or malloc) disk
# mlx* Mylex DAC960 RAID controllers
2001-03-06 01:02:23 +00:00
# mlxd* Mylex DAC960 RAID disk volumes
2001-02-25 22:52:55 +00:00
# mly* Mylex RAID controllers (newer models)
# scd* Sony CD-ROM disks
# wd* "Winchester" disk drives (ST506,IDE,ESDI,RLL,...)
# wfd* IDE floppy disk drives (LS-120)
#
# Console ports:
# vty* virtual console devices for syscons/pcvt/codrv
1995-03-12 15:25:32 +00:00
#
# Pointing devices:
# mse* Logitech and ATI Inport bus mouse
# psm* PS/2 mouse
2001-03-06 01:02:23 +00:00
# jogdial Sony VAIO jog dial
1996-09-08 23:56:27 +00:00
# sysmouse Mousesystems mouse emulator for syscons
#
# Time devices:
# refclock-* serial ports used by xntpd parse refclocks
#
# Terminal ports:
1995-03-12 15:25:32 +00:00
# tty* general purpose serial ports
# cua* dialout serial ports
# ttyA* Specialix SI/XIO dialin ports ('*' = number of devices)
# cuaA* Specialix SI/XIO dialout ports
# ttyDXX Digiboard Xi - 16 dialin ports (dgb)
# cuaDXX Digiboard Xi - 16 dialout ports (dgb)
# ttyDX.X Digiboards (work in progress) - 16 dialin ports (digi)
# cuaDX.X Digiboards (work in progress) - 16 dialout ports (digi)
# ttyM* Digiboard Xem - 16 dialin ports (dgm)
# cuaM* Digiboard Xem - 16 dialout ports (dgm)
# ttyR* Rocketport dialin ports
# cuaR* Rocketport dialout ports
#
# Pseudo terminals:
# pty* set of 32 master and slave pseudo terminals
# vty* virtual terminals using syscons/pcvt/codrv console
#
1998-11-12 22:45:24 +00:00
# Parallel port:
# lpt* Printer
# ppi* Parallel port i/o
# pps* Pulse per second timing interface
# pcfclock* Parallel time sync interface
1998-11-12 22:45:24 +00:00
#
# I2C and SMBus:
# iic* I2C devices
# smb* SMBUS devices
#
# USB devices:
1999-08-21 18:01:42 +00:00
# usb* USB bus control device
2000-10-29 14:06:12 +00:00
# ugen* generic USB device
2000-02-12 21:16:01 +00:00
# uhid* Human Interface Device (HID)
# ulpt* printer
2001-03-06 01:02:23 +00:00
# umodem* modems
2000-10-29 14:06:12 +00:00
# ums* mouse
2000-03-18 18:45:48 +00:00
# urio* Diamond Rio 500
2001-03-06 01:02:23 +00:00
# uscanner* USB scanners
# ucom* USB serial devices
#
# SCSI devices (other than CD-ROM, tape and disk):
# ch* SCSI Media-Changer (juke box) driver
# pt* Processor Type (HP scanner, as one example)
1998-09-15 10:21:35 +00:00
# pass* CAM Passthrough device
2000-01-15 21:04:13 +00:00
# ses* SES (SCSI Environmental Services) and
# SAF-TE (Scsi Accessable Fault-Tolerant Enclosures) device
#
# PC-CARD (previously called PCMCIA) support
# card* PC-CARD slots
#
# ISDN devices:
# i4b isdnd call control device
# i4bctl debugging control device
2001-03-06 01:02:23 +00:00
# i4btrc* trace data interface(s), one per passive card
# i4btel* telephony interface(s)
# i4bteld* telephony dialout interface(s)
# i4brbch* raw b channel access device(s)
#
# Special purpose devices:
2000-08-29 20:20:54 +00:00
# acpi Advanced Configuration and Power Interface
# apm Advanced Power Management BIOS
# apmctl APM BIOS control device
# bpf* packet filter
2002-10-04 20:44:46 +00:00
# crypto crypto interface
# speaker pc speaker
# tw* xten power controller
# snd* various sound cards
2001-03-06 01:02:23 +00:00
# pcaudio PCM audio driver
# socksys iBCS2 socket system driver
# vat VAT compatibility audio driver (requires snd*)
# gsc Genius GS-4500 hand scanner
1995-01-25 21:21:28 +00:00
# joy pc joystick
# tun* Tunneling IP device
# tap* Ethernet Tunneling device
# snp* tty snoop devices
1996-01-31 15:03:18 +00:00
# spigot Video Spigot video acquisition card
# ctx* Cortex-I video acquisition card
1996-01-31 15:03:18 +00:00
# meteor* Matrox Meteor video acquisition card (pci)
# bktr* Bt848 based video acquisition card (pci)
# labpc* National Instrument's Lab-PC and LAB-PC+
1996-03-26 21:04:54 +00:00
# perfmon CPU performance-monitoring counters
# pci PCI configuration-space access from user mode
2000-01-13 20:27:22 +00:00
# ipl ipfilter control devices (ipl, ipnat, ipstate, ipauth)
1999-01-06 16:18:05 +00:00
# kbd keyboard devices
2001-01-26 01:13:29 +00:00
# 3dfx* 3dfx voodoo device for glide (tdfx) (/dev/3dfx,3dfxN,voodoo)
# agpgart AGP interface
# cfs* Coda Distributed Filesystem
# nsmb* SMB/CIFS protocol interface
# elan-mmcr AMD Elan support (e.g. mmap MMCR)
#
if [ -n "$MAKEDEVPATH" ]; then
PATH="$MAKEDEVPATH"
else
PATH=/sbin:/bin
fi
umask 77
# Usage: die exitcode msg
die() {
echo $2
exit $1
}
# Convert integer to partition name
dkitop() {
local p
case $1 in
0) p=a;; 1) p=b;; 2) p=c;; 3) p=d;; 4) p=e;; 5) p=f;; 6) p=g;; 7) p=h;;
*) p="?";;
esac
echo $p
}
# Convert integer to slice name
dkitos() {
local s
case $1 in
0) s="";;
1) s="";;
*) s=s$(($1-1));;
esac
echo $s
}
# Convert disk (type, unit, slice, partition) to minor number
dkminor()
{
echo $(($1 << 25 | ($2 / 32) << 21 | ($2 % 32) << 3 | $3 << 16 | $4))
}
2001-11-25 12:49:32 +00:00
# Print the hexadecimal representation of a decimal value from 0 to 15.
hexdigit() {
local d
if [ $1 -lt 10 ]; then
2001-11-25 12:49:32 +00:00
d=$1
else
case $1 in
2001-11-25 12:49:32 +00:00
10) d=a;; 11) d=b;; 12) d=c;; 13) d=d;; 14) d=e;; 15) d=f;;
*) d="?";;
esac
fi
2001-11-25 12:49:32 +00:00
echo $d
}
2001-11-25 12:49:32 +00:00
# Print the hexadecimal representation of an arbitrary decimal value.
hexprint() {
local dig
local str
local val
val=$1
str=''
2001-11-25 12:49:32 +00:00
dig=`hexdigit $(($val & 15))`
str=$dig$str
val=$(($val >> 4))
while [ $val -gt 0 ]; do
dig=`hexdigit $(($val & 15))`
str=$dig$str
val=$(($val >> 4))
done
2001-11-25 12:49:32 +00:00
echo $str
}
1998-01-03 11:53:52 +00:00
# Override mknod(2) to add extra handling to it.
mknod=/sbin/mknod
for i in `IFS=':'; echo $PATH`; do
if [ -x "${i}/mknod" ]; then
mknod="${i}/mknod"
break
fi
done
mknod() {
rm -f "$1" || exit 1
case $# in
4) "$mknod" "$@" root:wheel || die 2 "$mknod $@ failed";;
5) "$mknod" "$@" || die 2 "$mknod $@ failed";;
*) die 2 "bad node: mknod $@";;
esac
}
# Convert tape (ctrl, unit, mode, access) to minor number
saminor()
{
echo $(($1 << 29 | ($2 / 16) << 16 | ($2 % 16) << 4 | $3 << 2 | $4))
}
# Convert the last character of a tty name to a minor number.
ttyminor()
{
case $1 in
[0-9]) m=$1;;
a) m=10;; b) m=11;; c) m=12;; d) m=13;; e) m=14;; f) m=15;; g) m=16;;
h) m=17;; i) m=18;; j) m=19;; k) m=20;; l) m=21;; m) m=22;; n) m=23;;
o) m=24;; p) m=25;; q) m=26;; r) m=27;; s) m=28;; t) m=29;; u) m=30;;
v) m=31;;
*) m="?";;
esac
echo $m
}
# Convert a unit number to a minor number.
unit2minor()
{
2001-11-25 12:49:32 +00:00
echo $(((($1 >> 8) << 16) | ($1 % 256)))
}
2001-11-25 12:49:32 +00:00
# Zero-pad a value to the appropriate minimum length.
zeropad() {
local min
local val
min=$1
val=$2
2001-11-25 12:49:32 +00:00
while [ ${#val} -lt $min ]; do
val=0$val
done
2001-11-25 12:49:32 +00:00
echo $val
}
# Raw partition for disks
dkrawpart=2
# Compatibility slice for disks
dkcompatslice=0
# Raw slice for disks
dkrawslice=1
# Standard umasks
disk_umask=037 # allow group operator to read disks
tape_umask=017 # allow group operator to read/write tapes
for i in $*; do
case $i in
all)
sh $0 std # standard
sh $0 fd0 fd1 # floppy disk
sh $0 da0 da1 da2 da3 # SCSI disk
sh $0 ata # ATA control
sh $0 ad0 ad1 ad2 ad3 # ATA disk
sh $0 ar0 ar1 # ATA RAID disk
sh $0 acd0 acd0t0 afd0 ast0 # ATAPI devices
sh $0 wd0 wd1 wd2 wd3 # OLD disk
sh $0 wcd0 wfd0 wst0 # OLD ATAPI devs
sh $0 cd0 mcd0 scd0 # cdrom
sh $0 sa0 wt0 # tape
sh $0 vty12 # virtual tty
sh $0 cuaa0 cuaa1 cuaa2 cuaa3 # serial tty
sh $0 pty0 # pseudo tty
sh $0 ttyd0 ttyd1 ttyd2 ttyd3 # serial tty
sh $0 kbd0 kbd1 # keyboard
sh $0 mse0 psm0 jogdial sysmouse # mouse
sh $0 pcaudio speaker # noise
sh $0 lpt0 lpt1 lpt2 # printer
sh $0 ppi0 ppi1 ppi2 # parallel port
sh $0 iic0 iic1 # I2C device
sh $0 smb0 smb1 # SMBus device
sh $0 usb usb0 uhid0 ums0 ulpt0 ugen0 # USB devices
sh $0 urio0 uscanner0 umodem0 # USB devices too
sh $0 bpf0 bpf1 bpf2 bpf3 # network
sh $0 ipl tun0 tun1 tun2 tun3 # network
sh $0 tap0 tap1 tap2 tap3 # network
sh $0 ch0 perfmon tw0 # miscellaneous
sh $0 acpi # ACPI
sh $0 apm apmctl card0 card1 card2 card3 # laptop
sh $0 pass4 xpt2 # CAM
sh $0 i4b i4bctl i4btrc0 i4btrc1 # ISDN
sh $0 i4btel0 i4btel1 i4bteld0 i4bteld1 # ISDN
sh $0 i4brbch0 i4brbch1 # ISDN
sh $0 agpgart # AGP
sh $0 nsmb0 # SMB/CIFS
At long last, commit the zero copy sockets code. MAKEDEV: Add MAKEDEV glue for the ti(4) device nodes. ti.4: Update the ti(4) man page to include information on the TI_JUMBO_HDRSPLIT and TI_PRIVATE_JUMBOS kernel options, and also include information about the new character device interface and the associated ioctls. man9/Makefile: Add jumbo.9 and zero_copy.9 man pages and associated links. jumbo.9: New man page describing the jumbo buffer allocator interface and operation. zero_copy.9: New man page describing the general characteristics of the zero copy send and receive code, and what an application author should do to take advantage of the zero copy functionality. NOTES: Add entries for ZERO_COPY_SOCKETS, TI_PRIVATE_JUMBOS, TI_JUMBO_HDRSPLIT, MSIZE, and MCLSHIFT. conf/files: Add uipc_jumbo.c and uipc_cow.c. conf/options: Add the 5 options mentioned above. kern_subr.c: Receive side zero copy implementation. This takes "disposable" pages attached to an mbuf, gives them to a user process, and then recycles the user's page. This is only active when ZERO_COPY_SOCKETS is turned on and the kern.ipc.zero_copy.receive sysctl variable is set to 1. uipc_cow.c: Send side zero copy functions. Takes a page written by the user and maps it copy on write and assigns it kernel virtual address space. Removes copy on write mapping once the buffer has been freed by the network stack. uipc_jumbo.c: Jumbo disposable page allocator code. This allocates (optionally) disposable pages for network drivers that want to give the user the option of doing zero copy receive. uipc_socket.c: Add kern.ipc.zero_copy.{send,receive} sysctls that are enabled if ZERO_COPY_SOCKETS is turned on. Add zero copy send support to sosend() -- pages get mapped into the kernel instead of getting copied if they meet size and alignment restrictions. uipc_syscalls.c:Un-staticize some of the sf* functions so that they can be used elsewhere. (uipc_cow.c) if_media.c: In the SIOCGIFMEDIA ioctl in ifmedia_ioctl(), avoid calling malloc() with M_WAITOK. Return an error if the M_NOWAIT malloc fails. The ti(4) driver and the wi(4) driver, at least, call this with a mutex held. This causes witness warnings for 'ifconfig -a' with a wi(4) or ti(4) board in the system. (I've only verified for ti(4)). ip_output.c: Fragment large datagrams so that each segment contains a multiple of PAGE_SIZE amount of data plus headers. This allows the receiver to potentially do page flipping on receives. if_ti.c: Add zero copy receive support to the ti(4) driver. If TI_PRIVATE_JUMBOS is not defined, it now uses the jumbo(9) buffer allocator for jumbo receive buffers. Add a new character device interface for the ti(4) driver for the new debugging interface. This allows (a patched version of) gdb to talk to the Tigon board and debug the firmware. There are also a few additional debugging ioctls available through this interface. Add header splitting support to the ti(4) driver. Tweak some of the default interrupt coalescing parameters to more useful defaults. Add hooks for supporting transmit flow control, but leave it turned off with a comment describing why it is turned off. if_tireg.h: Change the firmware rev to 12.4.11, since we're really at 12.4.11 plus fixes from 12.4.13. Add defines needed for debugging. Remove the ti_stats structure, it is now defined in sys/tiio.h. ti_fw.h: 12.4.11 firmware. ti_fw2.h: 12.4.11 firmware, plus selected fixes from 12.4.13, and my header splitting patches. Revision 12.4.13 doesn't handle 10/100 negotiation properly. (This firmware is the same as what was in the tree previously, with the addition of header splitting support.) sys/jumbo.h: Jumbo buffer allocator interface. sys/mbuf.h: Add a new external mbuf type, EXT_DISPOSABLE, to indicate that the payload buffer can be thrown away / flipped to a userland process. socketvar.h: Add prototype for socow_setup. tiio.h: ioctl interface to the character portion of the ti(4) driver, plus associated structure/type definitions. uio.h: Change prototype for uiomoveco() so that we'll know whether the source page is disposable. ufs_readwrite.c:Update for new prototype of uiomoveco(). vm_fault.c: In vm_fault(), check to see whether we need to do a page based copy on write fault. vm_object.c: Add a new function, vm_object_allocate_wait(). This does the same thing that vm_object allocate does, except that it gives the caller the opportunity to specify whether it should wait on the uma_zalloc() of the object structre. This allows vm objects to be allocated while holding a mutex. (Without generating WITNESS warnings.) vm_object_allocate() is implemented as a call to vm_object_allocate_wait() with the malloc flag set to M_WAITOK. vm_object.h: Add prototype for vm_object_allocate_wait(). vm_page.c: Add page-based copy on write setup, clear and fault routines. vm_page.h: Add page based COW function prototypes and variable in the vm_page structure. Many thanks to Drew Gallatin, who wrote the zero copy send and receive code, and to all the other folks who have tested and reviewed this code over the years.
2002-06-26 03:37:47 +00:00
sh $0 ti0 ti1 # ti(4)
2002-10-04 20:44:46 +00:00
sh $0 crypto # crypto
;;
# a much restricted set of the above, to save precious i-nodes on the
# fixit floppy
fixit)
sh $0 std # standard
sh $0 fd0 # floppy disk
sh $0 da0 # SCSI disk
sh $0 ad0 # ATA disk
sh $0 acd0 afd0 ast0 # ATAPI devices
sh $0 wd0 # OLD disk
sh $0 wcd0 wfd0 wst0 # OLD ATAPI devs
sh $0 cd0 # cdrom
sh $0 sa0 # tape
sh $0 vty2 # virtual tty
sh $0 cuaa0 # serial tty
sh $0 pty0 # pseudo tty
sh $0 ttyd0 # serial tty
sh $0 kbd0 # keyboard
sh $0 mse0 psm0 jogdial sysmouse # mouse
sh $0 lpt0 # printer
sh $0 ppi0 # parallel port
sh $0 iic0 # I2C device
sh $0 smb0 # SMBus device
sh $0 ums0 # USB devices
sh $0 tun0 # network
sh $0 tap0 # network
sh $0 ch0 # miscellaneous
sh $0 acpi # ACPI
sh $0 apm apmctl card0 # laptop
sh $0 pass1 xpt1 # CAM
sh $0 i4b i4bctl i4btrc0 i4btrc1 # ISDN
sh $0 i4btel0 i4bteld0 # ISDN
sh $0 i4brbch0 # ISDN
rm -f fd/[1-9]?
;;
std)
mknod console c 0 0; chmod 600 console
mknod kmem c 2 1 root:kmem; chmod 640 kmem
mknod mem c 2 0 root:kmem; chmod 640 mem
mknod null c 2 2; chmod 666 null
mknod random c 2 3; chmod 666 random
ln -f random urandom
mknod zero c 2 12; chmod 666 zero
mknod io c 2 14; chmod 600 io
mknod tty c 1 0; chmod 666 tty
mknod klog c 7 0; chmod 600 klog
mknod pci c 78 0; chmod 644 pci
mknod mdctl c 95 0xffff00ff; chmod 600 mdctl
mkdir -p fd
(cd fd && i=0 &&
while [ $i -lt 64 ]; do
mknod $i c 22 $i
i=$(($i + 1))
done
)
chmod 555 fd
chmod 666 fd/*
ln -sf fd/0 stdin
ln -sf fd/1 stdout
ln -sf fd/2 stderr
;;
jail)
sh $0 std pty0
rm mem kmem pci io klog console # for security
ln -sf null mem # for libkvm (ab)users
ln -sf null kmem # --//--
ln -sf null console
;;
mach-4)
mknod iopl c 22 0
mknod kbd c 23 0
mknod mouse c 24 0
mknod time c 25 0
mknod timezone c 26 0
;;
# Create device files for new Archive/Wangtek QIC-02 tape driver (vak)
wt*)
umask $tape_umask
u=`expr $i : '..\(.*\)'`
if [ -z "${u}" ]; then u=0; fi
# default density, 512b blocks
mknod rwt${u} c 10 $(( 0 + $u)) root:operator
mknod nrwt${u} c 10 $(( 4 + $u)) root:operator
# default density, 1024b blocks
# mknod rWt${u} c 10 $((64 + $u)) root:operator
# mknod nrWt${u} c 10 $((68 + $u)) root:operator
mknod rwt${u}b c 10 $((16 + $u)) root:operator # 60 megabytes
mknod nrwt${u}b c 10 $((20 + $u)) root:operator
mknod rwt${u}c c 10 $((24 + $u)) root:operator # 120 megabytes
mknod nrwt${u}c c 10 $((28 + $u)) root:operator
mknod rwt${u}d c 10 $((32 + $u)) root:operator # 150 megabytes
mknod nrwt${u}d c 10 $((36 + $u)) root:operator
# mknod rwt${u}e c 10 $((40 + $u)) root:operator # 300 megabytes?
# mknod nrwt${u}e c 10 $((44 + $u)) root:operator
# mknod rwt${u}f c 10 $((48 + $u)) root:operator # 600 megabytes?
# mknod nrwt${u}f c 10 $((52 + $u)) root:operator
From: Sergey Ryzhkov, Serge Vakulenko E-mail: <sir@kiae.su>, <vak@zebub.msk.su> added new /dev/wt entries for wt.c version 1.3 8) Some controllers support only 1024 block length. Setting WT_BSIZE bit in device minor number turns on this mode. Minor number structure: 0bfffuuu Fields: uuu - Unit number. It's possible to install up to three tape controllers on the same machine, using DRQs 1..3. Hence, unit number can lie in range 0..2. fff - Tape format number: 0 - /dev/rwt0 - default density (auto select) 1 - /dev/rwt0a - QIC 11 (obsolete) 2 - /dev/rwt0b - QIC 24 (60 megabytes) 3 - /dev/rwt0c - QIC 120 (120 megabytes) 4 - /dev/rwt0d - QIC 150 (150 megabytes) 5 - /dev/rwt0e - QIC 300 (300 megabytes?) 6 - /dev/rwt0f - QIC 600 (600 megabytes?) b - Long block size flag. With this bit set, the driver will perform all i/o operations with the controller using 1024-byte blocks, instead of 512 ones. Some controllers need it (CMS for example). If you Wangtek controller does not stream well, you can try to use /dev/rWt0 device instead of /dev/rwt0 (uncomment needed lines in /dev/MAKEDEV to create it). Block interface (writing blocks less than 2048 bytes) is not functioning pwoperly. Use raw interface instead. Thanks to all who helped to test it on the following hardware: Controller Drive Volume Interface Thanks to --------------------------------------------------------------------------- Archive SC-499 Archive 2150L 150 Meg QIC-02 KIAE CMS? ? 150 Meg QIC-02 KIAE Everex EV 831/833 ? ? QIC-36 Joergen Haegg Wangtek ASSY Wangtek 60 Meg QIC-02 Ken Whedbee Tecmar QT150i? Wangtek 5150EQ ? QIC-02? Marko Teiste ? Wangtek 5099EK 60 Meg QIC-36 Robert Shien Archive SC400S ? 60 Meg ? Warren Toomey
1993-12-14 11:11:37 +00:00
umask 77
;;
raidctl)
mknod raidctl c 201 0
;;
# Individual slices.
aacd*s*|ad*s*|ar*s*|afd*s*|amrd*s*|da*s*|fla*s*|idad*s*|md*s*|mlxd*s*|twed*s*|wd*s*|wfd*s*|raid*s*)
umask $disk_umask
case $i in
2000-09-13 05:03:02 +00:00
aacd*s*) name=aacd; chr=151;;
ad*s*) name=ad; chr=116;;
2000-10-24 14:31:24 +00:00
ar*s*) name=ar; chr=157;;
afd*s*) name=afd; chr=118;;
amrd*s*) name=amrd; chr=133;;
da*s*) name=da; chr=13;;
fla*s*) name=fla; chr=102;;
idad*s*) name=idad; chr=109;;
md*s*) name=md; chr=95;;
mlxd*s*) name=mlxd; chr=131;;
twed*s*) name=twed; chr=147;;
wd*s*) name=wd; chr=3;;
wfd*s*) name=wfd; chr=87;;
raid*s*) name=raid; chr=200;;
esac
case $i in
aacd*s*|amrd*s*|idad*s*|mlxd*s*|twed*s*|raid*s*)
unit=`expr $i : '....\([0-9]*\)s'`
slice=`expr $i : '....[0-9]*s\([0-9]*\)'`
part=`expr $i : '....[0-9]*s[0-9]*\(.*\)'`
;;
afd*s*|fla*s*|wfd*s*)
unit=`expr $i : '...\([0-9]*\)s'`
slice=`expr $i : '...[0-9]*s\([0-9]*\)'`
part=`expr $i : '...[0-9]*s[0-9]*\(.*\)'`
;;
*)
unit=`expr $i : '..\([0-9]*\)s'`
slice=`expr $i : '..[0-9]*s\([0-9]*\)'`
part=`expr $i : '..[0-9]*s[0-9]*\(.*\)'`
;;
esac
case $unit in
[0-9]|[0-9][0-9]|[0-4][0-9][0-9]|50[0-9]|51[0-1])
case $slice in
[0-9]|[1-2][0-9]|30)
oldslice=$slice
slice=$(($slice+1))
slicename=`dkitos $slice`
minor=`dkminor 0 $unit $slice $dkrawpart`
mknod $name$unit$slicename c $chr $minor root:operator
ln -f $name$unit$slicename r$name$unit$slicename
case $part in
[a-h])
case $oldslice in
0) slice=$oldslice ;;
esac
for part in 0 1 2 3 4 5 6 7
do
minor=`dkminor 0 $unit $slice $part`
partname=`dkitop $part`
mknod $name$unit$slicename$partname \
c $chr $minor root:operator
ln -f $name$unit$slicename$partname \
r$name$unit$slicename$partname
done
;;
"")
;;
*)
echo bad partition for disk in: $i
;;
esac
;;
*)
echo bad slice for disk in: $i
;;
esac
;;
*)
echo bad unit for disk in: $i "(unit=$unit, slice=$slice, part=$part)"
;;
esac
umask 77
;;
fd*)
umask $disk_umask
unit=`expr $i : '..\(.*\)'`
name=fd; chr=9
case $unit in
0|1|2|3)
mknod ${name}${unit} c $chr $(($unit * 64)) root:operator
# Fake BSD partitions
for i in a b c d e f g h
do
ln -f ${name}${unit} ${name}${unit}$i
done
;;
*)
echo bad unit for disk in: $i
;;
esac
umask 77
;;
2001-03-15 15:32:42 +00:00
ata)
umask 177
mknod ata c 159 0 root:operator
umask 77
;;
aacd*|ad*|ar*|afd*|amrd*|da*|fla*|idad*|md*|mlxd*|twed*|wd*|wfd*|raid*)
umask $disk_umask
case $i in
2000-09-13 05:03:02 +00:00
aacd*) name=aacd; chr=151;;
ad*) name=ad; chr=116;;
2000-10-24 14:31:24 +00:00
ar*) name=ar; chr=157;;
afd*) name=afd; chr=118;;
amrd*) name=amrd; chr=133;;
da*) name=da; chr=13;;
fla*) name=fla; chr=102;;
idad*) name=idad; chr=109;;
md*) name=md; chr=95;;
mlxd*) name=mlxd; chr=131;;
twed*) name=twed; chr=147;;
wd*) name=wd; chr=3;;
wfd*) name=wfd; chr=87;;
raid*) name=raid; chr=200;;
esac
case $i in
aacd*|amrd*|idad*|mlxd*|twed*|raid*)
unit=`expr $i : '....\(.*\)'`
;;
afd*|fla*|wfd*)
unit=`expr $i : '...\(.*\)'`
;;
*)
unit=`expr $i : '..\(.*\)'`
;;
esac
case $unit in
[0-9]|[0-9][0-9]|[0-4][0-9][0-9]|50[0-9]|51[0-1])
for slicepartname in s0h s1h s2 s3 s4
do
sh $0 $name$unit$slicepartname
done
;;
*)
echo bad unit for disk in: $i
;;
esac
umask 77
;;
ccd*)
umask $disk_umask
name=ccd
chr=74
1998-10-31 05:27:02 +00:00
unit=`expr $i : '...\(.*\)'`
case $unit in
[0-9]|[0-9][0-9]|[0-4][0-9][0-9]|50[0-9]|51[0-1])
for part in 0 1 2 3 4 5 6 7
do
minor=`dkminor 0 $unit 0 $part`
1998-10-31 05:27:02 +00:00
partname=`dkitop $part`
mknod $name$unit$partname c $chr $minor root:operator
ln -f $name$unit$partname r$name$unit$partname
1998-10-31 05:27:02 +00:00
done
;;
*)
echo bad unit for disk in: $i
;;
esac
umask 77
;;
# SCSI processor type driver
pt[0-9]*)
chr=61
name=pt
unit=`expr $i : 'pt\([0-9][0-9]*\)'`
if [ -z "${unit}" ]; then
unit=0
fi
unit=$(($unit + 1 - 1))
mknod ${name}${unit} c $chr `unit2minor $unit`
;;
2000-01-15 21:04:13 +00:00
# SCSI SES/SAF-TE type driver
ses[0-9]*)
chr=110
name=ses
unit=`expr $i : 'ses\([0-9][0-9]*\)'`
if [ -z "${unit}" ]; then
unit=0
fi
unit=$(($unit + 1 - 1))
mknod ${name}${unit} c $chr `unit2minor $unit`
2000-01-15 21:04:13 +00:00
;;
1998-09-15 10:21:35 +00:00
# SCSI target mode sample driver
targ[0-9]*)
chr=65
name=targ
unit=`expr $i : 'targ\([0-9][0-9]*\)'`
if [ -z "${unit}" ]; then
1998-09-15 10:21:35 +00:00
unit=0
fi
unit=$(($unit + 1 - 1))
mknod ${name}${unit} c $chr `unit2minor $unit`
mknod ${name}.ctl c $chr 0xffff00ff
1998-09-15 10:21:35 +00:00
;;
# CAM transport layer device
xpt*)
# This major number is temporary
chr=104
name=xpt
units=`expr $i : 'xpt\(.*\)'`
if [ -z "${units}" ]; then
1998-09-15 10:21:35 +00:00
units=1
fi
i=0
while [ $i -lt $units ]; do
dname=$name$i
rm -rf $dname r$dname
mknod $dname c $chr `unit2minor $i` root:operator
i=$(($i + 1))
done
1998-09-15 10:21:35 +00:00
;;
1998-09-15 10:21:35 +00:00
# CAM passthrough device
pass*)
1998-09-15 10:21:35 +00:00
# This major number is temporary
chr=31
name=pass
units=`expr $i : 'pass\(.*\)'`
if [ -z "${units}" ]; then
1998-09-15 10:21:35 +00:00
units=1
fi
i=0
while [ $i -lt $units ]; do
dname=$name$i
rm -rf $dname r$dname
mknod $dname c $chr `unit2minor $i` root:operator
i=$(($i + 1))
done
1998-09-15 10:21:35 +00:00
;;
pty*)
class=`expr $i : 'pty\(.*\)'`
case $class in
0) offset=0 name=p;;
1) offset=32 name=q;;
2) offset=64 name=r;;
3) offset=96 name=s;;
# Note that xterm (at least) only look at p-s.
1995-03-12 15:25:32 +00:00
4) offset=128 name=P;;
5) offset=160 name=Q;;
6) offset=192 name=R;;
7) offset=224 name=S;;
# This still leaves [tuTU].
*) echo bad unit for pty in: $i;;
esac
umask 0
case $class in
0|1|2|3|4|5|6|7)
i=0
while [ $i -lt 32 ]; do
# This was an awk substr() before.
c=$(echo 0123456789abcdefghijklmnopqrstuv |
dd bs=1 skip=$i count=1 2>/dev/null)
mknod tty$name$c c 5 $(($offset + $i))
mknod pty$name$c c 6 $(($offset + $i))
i=$(($i + 1))
done
;;
esac
umask 77
;;
1998-09-15 10:21:35 +00:00
sa*)
umask $tape_umask
unit=`expr $i : '..\(.*\)'`
chr=14
case $unit in
[0-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9])
2000-05-08 21:32:24 +00:00
mknod sa${unit}.ctl c $chr `saminor 1 ${unit} 0 0`
ln -f sa${unit}.ctl rsa${unit}.ctl
for m in 0 1 2 3
do
2000-05-08 21:32:24 +00:00
mknod sa${unit}.${m} c $chr \
`saminor 0 ${unit} ${m} 0` root:operator
ln -f sa${unit}.${m} rsa${unit}.${m}
2000-05-08 21:32:24 +00:00
mknod nsa${unit}.${m} c $chr \
`saminor 0 ${unit} ${m} 1` root:operator
ln -f nsa${unit}.${m} nrsa${unit}.${m}
mknod esa${unit}.${m} c $chr \
`saminor 0 ${unit} ${m} 2` root:operator
2000-05-08 21:32:24 +00:00
ln -f esa${unit}.${m} ersa${unit}.${m}
done
2000-05-08 21:32:24 +00:00
ln -f sa${unit}.0 sa${unit}
ln -f sa${unit}.0 rsa${unit}.0
ln -f sa${unit}.0 rsa${unit}
ln -f nsa${unit}.0 nsa${unit}
ln -f nsa${unit}.0 nrsa${unit}.0
ln -f nsa${unit}.0 nrsa${unit}
ln -f esa${unit}.0 esa${unit}
ln -f esa${unit}.0 ersa${unit}.0
ln -f esa${unit}.0 ersa${unit}
;;
*)
echo bad unit for tape in: $i
1995-03-12 15:25:32 +00:00
;;
esac
umask 77
;;
ch*)
umask 37
unit=`expr $i : '..\(.*\)'`
case $i in
ch*) name=ch; chr=17;;
esac
case $unit in
0|1|2|3|4|5|6)
mknod ${name}${unit} c $chr $unit root:operator
;;
*)
echo bad unit for media changer in: $i
;;
esac
umask 77
;;
ast*)
umask 2 ;
unit=`expr $i : '...\(.*\)'`
chr=119
case $unit in
0|1|2|3)
mknod ast${unit} c $chr $(($unit * 8 + 0)) root:operator
chmod 640 ast${unit}
mknod nast${unit} c $chr $(($unit * 8 + 1)) root:operator
chmod 640 nast${unit}
;;
*)
echo bad unit for tape in: $i
;;
esac
umask 77
;;
acd*t*)
umask $disk_umask
units=`expr $i : '...\(.*\)t'`;
tracks=`expr $i : '.*t\(.*\)'`;
name=acd;
chr=117;
if [ -z "${units}" ]; then
units=0
fi
if [ -z "${tracks}" ]; then
tracks=100
fi
if [ "${units}" -le 31 -a "${tracks}" -le 169 ]; then
i=0
while [ $i -le $units ]; do
dname=$name$i
rm -rf ${dname}t*
j=1
while [ $j -le ${tracks} ]; do
mknod ${dname}t$j c $chr \
$((($i * 8) + (65536 * $j))) \
root:operator
j=$(($j + 1))
done
i=$(($i + 1))
done
else
echo "$i is invalid -- can't have more than 32 cd devices or 169 tracks"
fi
umask 77
;;
acd*|cd*|mcd*|scd*)
umask $disk_umask
case $i in
acd*) units=`expr $i : '...\(.*\)'`; name=acd; chr=117;;
cd*) units=`expr $i : '..\(.*\)'`; name=cd; chr=15;;
mcd*) units=`expr $i : '...\(.*\)'`; name=mcd; chr=29;;
scd*) units=`expr $i : '...\(.*\)'`; name=scd; chr=45;;
esac
if [ -z "${units}" ]; then
units=0
1998-09-15 10:21:35 +00:00
fi
if [ "${units}" -le 31 ]; then
i=0
while [ $i -le $units ]; do
dname=$name$i
rm -rf ${dname}[!t]* r${dname}*
mknod ${dname}a c $chr $(($i * 8)) root:operator
mknod ${dname}c c $chr $(($i * 8 + 2)) root:operator
ln -f ${dname}a r${dname}a
ln -f ${dname}c r${dname}c
i=$(($i + 1))
done
1998-09-15 10:21:35 +00:00
else
echo "$i is invalid -- can't have more than 32 cd devices"
fi
umask 77
;;
wcd*)
umask 2 ;
unit=`expr $i : '...\(.*\)'`
chr=69
case $unit in
0|1|2|3|4|5|6|7)
mknod wcd${unit}a c $chr $(($unit * 8 + 0)) root:operator
mknod wcd${unit}c c $chr $(($unit * 8 + 2)) root:operator
ln -f wcd${unit}a rwcd${unit}a
ln -f wcd${unit}c rwcd${unit}c
chmod 640 wcd${unit}[a-h] rwcd${unit}[a-h]
;;
*)
echo bad unit for disk in: $i
;;
esac
umask 77
;;
wst*)
umask 2 ;
unit=`expr $i : '...\(.*\)'`
chr=90
case $unit in
0|1|2|3)
mknod rwst${unit} c $chr $(($unit * 8 + 0)) root:operator
chmod 640 rwst${unit}
;;
esac
umask 77
;;
1998-11-12 22:45:24 +00:00
iic*)
unit=`expr $i : 'iic\(.*\)'`
mknod iic$unit c 105 `unit2minor $unit`
1998-11-12 22:45:24 +00:00
;;
smb*)
unit=`expr $i : 'smb\(.*\)'`
mknod smb$unit c 106 `unit2minor $unit`
1998-11-12 22:45:24 +00:00
;;
pcfclock*)
unit=`expr $i : 'pcfclock\(.*\)'`
mknod pcfclock$unit c 140 `unit2minor $unit`
;;
1998-11-12 22:45:24 +00:00
ppi*)
unit=`expr $i : 'ppi\(.*\)'`
mknod ppi$unit c 82 `unit2minor $unit`
1998-11-12 22:45:24 +00:00
;;
pps*)
unit=`expr $i : 'pps\(.*\)'`
mknod pps$unit c 89 `unit2minor $unit`
;;
usb)
mknod usb c 108 255 root:operator
chmod 0660 usb
;;
usb*)
umask 7
unit=`expr $i : 'usb\(.*\)'`
mknod usb$unit c 108 `unit2minor $unit` root:operator
umask 77
;;
2000-02-12 21:16:01 +00:00
uhid*)
umask 7
2000-02-12 21:16:01 +00:00
unit=`expr $i : 'uhid\(.*\)'`
mknod uhid$unit c 122 `unit2minor $unit` root:operator
umask 77
2000-02-12 21:16:01 +00:00
;;
ums*)
umask 7
unit=`expr $i : 'ums\(.*\)'`
mknod ums$unit c 111 `unit2minor $unit` root:operator
umask 77
;;
ulpt*)
unit=`expr $i : 'ulpt\(.*\)'`
minor=`unit2minor $unit`
mknod ulpt$unit c 113 $minor
minor=`unit2minor $(($unit + 64))`
mknod unlpt$unit c 113 $minor # and the 'no prime' version
;;
1999-01-12 01:31:13 +00:00
ugen*)
umask 7
unit=`expr $i : 'ugen\([0-9][0-9]*\)'`
endpoint=`expr $i : 'ugen.*\.\([0-9][0-9]*\)'`
if [ -z "${unit}" ]; then
echo $i - Invalid unit number
fi
if [ -z "${endpoint}" ]; then # ugen0 & ugen0.1 - ugen0.15
mknod ugen$unit c 114 \
`unit2minor $(($unit * 16))` root:operator
i=1
while [ $i -lt 16 ]; do
mknod ugen$unit.$i c 114 \
`unit2minor $(($unit * 16 + $i))` root:operator
i=$(($i + 1))
done
else
minor=`unit2minor $(($unit * 16 + $endpoint))`
mknod ugen$unit.$endpoint c 114 $minor root:operator
fi
umask 77
1999-01-12 01:31:13 +00:00
;;
2000-03-18 18:45:48 +00:00
urio*)
umask 7
2000-03-18 18:45:48 +00:00
unit=`expr $i : 'urio\(.*\)'`
mknod urio$unit c 143 `unit2minor $unit` root:operator
umask 77
2000-03-18 18:45:48 +00:00
;;
ucom*)
umask 7
unit=`expr $i : 'ucom\(.*\)'`
minor=`unit2minor $(($unit + 128))`
mknod ucom$unit c 138 $minor uucp:dialer
umask 77
2000-03-26 12:59:22 +00:00
;;
uscanner*)
umask 7
unit=`expr $i : 'uscanner\(.*\)'`
mknod uscanner$unit c 156 `unit2minor $unit` root:operator
umask 77
;;
2000-10-29 14:06:12 +00:00
umodem*)
umask 7
unit=`expr $i : 'umodem\(.*\)'`
mknod umodem$unit c 124 `unit2minor $unit` uucp:dialer
umask 77
;;
2000-10-29 14:06:12 +00:00
lpt*)
unit=`expr $i : 'lpt\(.*\)'`
mknod lpt$unit c 16 `unit2minor $unit`
mknod lpctl$unit c 16 `unit2minor $(($unit + 128))`
;;
# Use this to create virtual consoles for syscons, pcvt or codrv
# ttyv0-b
# use as MAKEDEV vtyNN to create NN entries
vty*)
chr=12
units=`expr $i : 'vty\(.*\)'`
i=0
while [ $i -lt $units ]; do
mknod ttyv$(hexprint $i) c $chr `unit2minor $i`
i=$(($i + 1))
done
ln -fs ttyv0 vga # XXX X still needs this pccons relic
;;
2001-02-27 18:36:56 +00:00
nmdm*)
units=`expr $i : 'nmdm\(.*\)'`
chr=18
i=0
while [ $i -lt $units ]; do
minor=`unit2minor $i`
minor=$(($minor + $minor))
mknod nmdm${i}A c $chr $minor
mknod nmdm${i}B c $chr $(($minor + 1))
i=$(($i + 1))
done
;;
bpf*)
units=`expr $i : 'bpf\(.*\)$'`
unit=0
while [ $unit -le $units ]; do
mknod bpf$unit c 23 `unit2minor $unit`
unit=$(($unit + 1))
done
;;
speaker)
mknod speaker c 26 0
;;
cua?|cuaa?|cuaa??)
umask 7
unit_low=`expr $i : 'cua.*\(.\)$'`
case $i in
cua?|cuaa?)
unit_high=""
m_high=0
;;
cuaa??)
unit_high=`expr $i : 'cuaa\(.\).$'`
m_high=`ttyminor $unit_high`
;;
esac
unit=$unit_high$unit_low
m=$(($m_high << 16 | `ttyminor $unit_low`))
mknod cuaa$unit c 28 $(($m | 128)) uucp:dialer
mknod cuaia$unit c 28 $(($m | 32 | 128)) uucp:dialer
mknod cuala$unit c 28 $(($m | 64 | 128)) uucp:dialer
umask 77
;;
tty?|tty0?|ttyd?|ttyd??)
unit_low=`expr $i : 'tty.*\(.\)$'`
case $i in
tty?|tty0?|ttyd?)
unit_high=""
m_high=0
;;
ttyd??)
unit_high=`expr $i : 'ttyd\(.\).$'`
m_high=`ttyminor $unit_high`
;;
esac
unit=$unit_high$unit_low
m=$(($m_high << 16 | `ttyminor $unit_low`))
mknod ttyd$unit c 28 $m
mknod ttyid$unit c 28 $(($m | 32))
mknod ttyld$unit c 28 $(($m | 64))
;;
cuac?)
umask 7
portlist="0 1 2 3 4 5 6 7 8 9 a b c d e f
g h i j k l m n o p q r s t u v"
major=48
card=`expr $i : 'cua.*\(.\)$'`
for unit in $portlist
do
minor=`ttyminor $unit`
minor=$(($card * 65536 + $minor))
name=$card$unit
mknod cuac$name c $major $(($minor + 128)) uucp:dialer
mknod cuaic$name c $major $(($minor + 32 + 128)) uucp:dialer
mknod cualc$name c $major $(($minor + 64 + 128)) uucp:dialer
done
umask 77
;;
ttyc?)
portlist="0 1 2 3 4 5 6 7 8 9 a b c d e f
g h i j k l m n o p q r s t u v"
major=48
card=`expr $i : 'tty.*\(.\)$'`
for unit in $portlist
do
minor=`ttyminor $unit`
minor=$(($card * 65536 + $minor))
name=$card$unit
mknod ttyc$name c $major $minor
mknod ttyic$name c $major $(($minor + 32))
mknod ttylc$name c $major $(($minor + 64))
done
;;
# RISCom8 'rc' driver entries
cuam?)
1995-04-23 12:02:21 +00:00
umask 7
unit=`expr $i : 'cua.*\(.\)$'`
m=`ttyminor $unit`
mknod cuam$unit c 63 $(($m + 128)) uucp:dialer
1995-04-23 12:02:21 +00:00
umask 77
;;
ttym?)
1995-04-23 12:02:21 +00:00
unit=`expr $i : 'tty.*\(.\)$'`
m=`ttyminor $unit`
mknod ttym$unit c 63 $m
1995-04-23 12:02:21 +00:00
;;
# Specialix SI/XIO.
# Note: these are 'base 1' to match the numbers on the panels, and to match
# the manual that comes with the system.
ttyA*)
major=68
units=`expr $i : 'ttyA\(.*\)$'`
port=1
while [ $port -le $units ]; do
minor=$(($port - 1))
name=$(zeropad 2 $port)
mknod ttyA$name c $major $minor
mknod ttyiA$name c $major $(($minor + 65536))
mknod ttylA$name c $major $(($minor + 131072))
port=$(($port + 1))
done
# For the user-mode control program, 'sicontrol'
mknod si_control c 68 262144
;;
cuaA*)
umask 7
major=68
units=`expr $i : 'cuaA\(.*\)$'`
port=1
while [ $port -le $units ]; do
minor=$(($port - 1))
name=$(zeropad 2 $port)
mknod cuaA$name c $major $(($minor + 128)) uucp:dialer
mknod cuaiA$name c $major $(($minor + 128 + 65536)) \
uucp:dialer
mknod cualA$name c $major $(($minor + 128 + 131072)) \
uucp:dialer
port=$(($port + 1))
done
umask 77
;;
# Alpha AS8[24]00 (TurboLaser) console.
zs?)
unit=`expr $i : 'zs.*\(.\)$'`
m=`ttyminor $unit`
mknod zs$unit c 135 $m
;;
# Digiboard PC/?? 16 port card.
# The current scheme of minor numbering is:
#
# unused{14} CARD{2} major{8} CALLOUT{1} LOCK{1} INIT{1} PORT{5}
#
# CARD bitfield in future versions may be extended to 3 bits.
#
# See dgb(4)
#
ttyD?)
portlist="0 1 2 3 4 5 6 7 8 9 a b c d e f"
major=58
card=`expr $i : 'tty.*\(.\)$'`
for unit in $portlist
do
minor=`ttyminor $unit`
minor=$(($card * 65536 + $minor))
name=$card$unit
mknod ttyD$name c $major $minor
mknod ttyiD$name c $major $(($minor + 32))
mknod ttylD$name c $major $(($minor + 64))
done
# Also create devices for the digi driver
umask 7
major=162
card=`expr $i : 'tty.*\(.\)$'`
rm -f digi$card.ctl
mknod digi$card.ctl c $major $(($card * 65536 + 8388608)) uucp:dialer
unit=0
while [ $unit -lt 16 ]
do
base=$(($card * 65536 + $unit))
name=$card.$unit
rm -f tty*D$name
mknod ttyD$name c $major $base
mknod ttyiD$name c $major $(($base + 1048576))
mknod ttylD$name c $major $(($base + 2097152))
unit=$(($unit + 1))
done
umask 77
;;
cuaD?)
umask 7
portlist="0 1 2 3 4 5 6 7 8 9 a b c d e f"
major=58
card=`expr $i : 'cua.*\(.\)$'`
for unit in $portlist
do
minor=`ttyminor $unit`
minor=$(($card * 65536 + $minor))
name=$card$unit
mknod cuaD$name c $major $(($minor + 128)) uucp:dialer
mknod cuaiD$name c $major $(($minor + 32 + 128)) uucp:dialer
mknod cualD$name c $major $(($minor + 64 + 128)) uucp:dialer
done
# Also create devices for the digi driver
major=162
card=`expr $i : 'cua.*\(.\)$'`
rm -f digi$card.ctl
mknod digi$card.ctl c $major $(($card * 65536 + 8388608)) uucp:dialer
unit=0
while [ $unit -lt 16 ]
do
base=$(($card * 65536 + $unit))
name=$card.$unit
rm -f cua*D$name
mknod cuaD$name c $major $(($base + 4194304)) uucp:dialer
mknod cuaiD$name c $major $(($base + 5242880)) uucp:dialer
mknod cualD$name c $major $(($base + 6291456)) uucp:dialer
unit=$(($unit + 1))
done
umask 77
;;
# Digiboard Xem - superceeded by the digi device above
#
ttyM*)
portlist="0 1 2 3 4 5 6 7 8 9 a b c d e f"
modulelist="a b c d"
major=101
card=`expr $i : 'tty.*\(.\)$'`
for unit in $modulelist
do
moduleminor=`ttyminor $unit`
moduleminor=$(($moduleminor % 10 * 16))
modulename=$unit
for unit in $portlist
do
minor=`ttyminor $unit`
minor=$(($card * 65536 + $minor + $moduleminor))
name=$card$modulename$unit
rm -f tty*M$name
mknod ttyM$name c $major $minor
mknod ttyiM$name c $major $(($minor + 64))
mknod ttylM$name c $major $(($minor + 128))
done
done
;;
cuaM?)
umask 7
portlist="0 1 2 3 4 5 6 7 8 9 a b c d e f"
modulelist="a b c d"
major=101
card=`expr $i : 'cua.*\(.\)$'`
for unit in $modulelist
do
moduleminor=`ttyminor $unit`
moduleminor=$(($moduleminor % 10 * 16))
modulename=$unit
for unit in $portlist
do
minor=`ttyminor $unit`
minor=$(($card * 65536 + $minor + $moduleminor))
name=$card$modulename$unit
rm -f cua*M$name
mknod cuaM$name c $major $(($minor + 262144)) \
uucp:dialer
mknod cuaiM$name c $major $(($minor + 64 + 262144)) \
uucp:dialer
mknod cualM$name c $major $(($minor + 128 + 262144)) \
uucp:dialer
done
done
umask 77
;;
ttyR?)
major=81
BOARD=1; Rnum=0
MINOR=$(($BOARD * 65536))
controllers=$(
dmesg | while read first rest; do
case "$first" in
RocketPort[0-4])
echo "$first"
;;
esac
done
)
rm -f ttyR* ttyiR* ttylR*
for i in $controllers; do
ndevices=$(
dmesg | while read first foo bar ports rest; do
case "$first" in
$i*)
echo "$ports"
;;
esac
done
)
echo -n "Creating $ndevices devices for $i: "
dev=0
while [ $dev -lt $ndevices ]; do
mknod ttyR$Rnum c $major $MINOR
mknod ttyiR$Rnum c $major $(($MINOR + 32))
mknod ttylR$Rnum c $major $(($MINOR + 64))
Rnum=$(($Rnum + 1))
MINOR=$(($MINOR + 1))
dev=$(($dev + 1))
done
BOARD=$(($BOARD + 1))
MINOR=$(($BOARD * 65536))
echo " "
done
;;
cuaR?)
major=81
BOARD=1; Rnum=0
MINOR=$(($BOARD * 65536))
controllers=$(
dmesg | while read first rest; do
case "$first" in
RocketPort[0-4])
echo "$first"
;;
esac
done
)
rm -f cuaR* cuaiR* cualR*
for i in $controllers; do
ndevices=$(
dmesg | while read first foo bar ports rest; do
case "$first" in
$i*)
echo "$ports"
;;
esac
done
)
echo -n "Creating $ndevices devices for $i: "
dev=0
while [ $dev -lt $ndevices ]; do
mknod cuaR$Rnum c $major $(($MINOR + 128)) uucp:dialer
mknod cuaiR$Rnum c $major $(($MINOR + 128 + 32)) \
uucp:dialer
mknod cualR$Rnum c $major $(($MINOR + 128 + 64)) \
uucp:dialer
Rnum=$(($Rnum + 1))
MINOR=$(($MINOR + 1))
dev=$(($dev + 1))
done
BOARD=$(($BOARD + 1))
MINOR=$(($BOARD * 65536))
echo " "
done
;;
mse*)
unit=`expr $i : 'mse\(.*\)'`
chr=27
# non-blocking for X11
mknod mse$unit c $chr `unit2minor $(($unit * 2 + 1))`
;;
psm*)
unit=`expr $i : 'psm\(.*\)'`
chr=21
# non-blocking for X11
mknod psm$unit c $chr `unit2minor $(($unit * 2 + 1))`
;;
mouse*)
1994-12-08 00:44:55 +00:00
name=`expr $i : 'mouse\(.*\)'`
if [ ! -c $name ]; then
$0 $name # make the appropriate device
fi
ln -fs $name mouse
;;
1994-04-21 14:08:27 +00:00
pcaudio)
mknod pcaudio c 24 0
mknod pcaudioctl c 24 128
1994-04-21 14:08:27 +00:00
;;
socksys)
mknod socksys c 41 0
mknod spx c 41 1
ln -fs socksys nfsd
chmod 666 socksys nfsd spx
;;
snd*)
#
# changes from Linux voxware
1996-01-31 15:03:18 +00:00
# minor Linux FreeBSD
# 8 sequencer2 (aka music0) music0
# 17 patmgr0 sequencer1
# 33 patmgr1 sequencer2
#
unit=`expr $i : 'snd\(.*\)'`
chr=30
# XXX write this less verbosely, like std
snd_security_hole=0 # XXX
umask $snd_security_hole
ln -fs mixer$unit mixer
ln -fs sequencer$unit sequencer
ln -fs dsp$unit dsp
ln -fs audio$unit audio
ln -fs dspW$unit dspW
ln -fs music$unit music
ln -fs pss$unit pss
mknod mixer$unit c $chr `unit2minor $(($unit * 16 + 0))`
mknod sequencer$unit c $chr `unit2minor $(($unit * 16 + 1))`
mknod midi$unit c $chr `unit2minor $(($unit * 16 + 2))`
mknod dsp$unit c $chr `unit2minor $(($unit * 16 + 3))`
mknod audio$unit c $chr `unit2minor $(($unit * 16 + 4))`
mknod dspW$unit c $chr `unit2minor $(($unit * 16 + 5))`
mknod sndstat c $chr 6
# minor number 7 is unused
mknod music$unit c $chr `unit2minor $(($unit * 16 + 8))`
mknod pss$unit c $chr `unit2minor $(($unit * 16 + 9))`
# minor number 10 is unused
mknod midistat c $chr 11
# minor numbers 12-15 are unused
umask 77
;;
vat)
mknod vatio c 25 128
chmod 660 vatio
;;
gsc*)
unit=`expr $i : 'gsc\(.*\)'`
mknod gsc${unit} c 47 `unit2minor $unit`
mknod gsc${unit}p c 47 `unit2minor $(($unit + 8))`
mknod gsc${unit}d c 47 `unit2minor $(($unit + 32))`
mknod gsc${unit}pd c 47 `unit2minor $(($unit + 40))`
chmod 666 gsc${unit}*
;;
2000-08-29 20:20:54 +00:00
acpi)
mknod acpi c 152 0 root:operator
chmod 660 acpi
;;
apm)
mknod apm c 39 0 root:operator
chmod 664 apm
;;
apmctl)
mknod apmctl c 39 8 root:operator
chmod 660 apmctl
;;
card*)
unit=`expr $i : 'card\(.*\)'`
chr=50
mknod card$unit c $chr `unit2minor $unit`
chmod 644 card$unit
;;
At long last, commit the zero copy sockets code. MAKEDEV: Add MAKEDEV glue for the ti(4) device nodes. ti.4: Update the ti(4) man page to include information on the TI_JUMBO_HDRSPLIT and TI_PRIVATE_JUMBOS kernel options, and also include information about the new character device interface and the associated ioctls. man9/Makefile: Add jumbo.9 and zero_copy.9 man pages and associated links. jumbo.9: New man page describing the jumbo buffer allocator interface and operation. zero_copy.9: New man page describing the general characteristics of the zero copy send and receive code, and what an application author should do to take advantage of the zero copy functionality. NOTES: Add entries for ZERO_COPY_SOCKETS, TI_PRIVATE_JUMBOS, TI_JUMBO_HDRSPLIT, MSIZE, and MCLSHIFT. conf/files: Add uipc_jumbo.c and uipc_cow.c. conf/options: Add the 5 options mentioned above. kern_subr.c: Receive side zero copy implementation. This takes "disposable" pages attached to an mbuf, gives them to a user process, and then recycles the user's page. This is only active when ZERO_COPY_SOCKETS is turned on and the kern.ipc.zero_copy.receive sysctl variable is set to 1. uipc_cow.c: Send side zero copy functions. Takes a page written by the user and maps it copy on write and assigns it kernel virtual address space. Removes copy on write mapping once the buffer has been freed by the network stack. uipc_jumbo.c: Jumbo disposable page allocator code. This allocates (optionally) disposable pages for network drivers that want to give the user the option of doing zero copy receive. uipc_socket.c: Add kern.ipc.zero_copy.{send,receive} sysctls that are enabled if ZERO_COPY_SOCKETS is turned on. Add zero copy send support to sosend() -- pages get mapped into the kernel instead of getting copied if they meet size and alignment restrictions. uipc_syscalls.c:Un-staticize some of the sf* functions so that they can be used elsewhere. (uipc_cow.c) if_media.c: In the SIOCGIFMEDIA ioctl in ifmedia_ioctl(), avoid calling malloc() with M_WAITOK. Return an error if the M_NOWAIT malloc fails. The ti(4) driver and the wi(4) driver, at least, call this with a mutex held. This causes witness warnings for 'ifconfig -a' with a wi(4) or ti(4) board in the system. (I've only verified for ti(4)). ip_output.c: Fragment large datagrams so that each segment contains a multiple of PAGE_SIZE amount of data plus headers. This allows the receiver to potentially do page flipping on receives. if_ti.c: Add zero copy receive support to the ti(4) driver. If TI_PRIVATE_JUMBOS is not defined, it now uses the jumbo(9) buffer allocator for jumbo receive buffers. Add a new character device interface for the ti(4) driver for the new debugging interface. This allows (a patched version of) gdb to talk to the Tigon board and debug the firmware. There are also a few additional debugging ioctls available through this interface. Add header splitting support to the ti(4) driver. Tweak some of the default interrupt coalescing parameters to more useful defaults. Add hooks for supporting transmit flow control, but leave it turned off with a comment describing why it is turned off. if_tireg.h: Change the firmware rev to 12.4.11, since we're really at 12.4.11 plus fixes from 12.4.13. Add defines needed for debugging. Remove the ti_stats structure, it is now defined in sys/tiio.h. ti_fw.h: 12.4.11 firmware. ti_fw2.h: 12.4.11 firmware, plus selected fixes from 12.4.13, and my header splitting patches. Revision 12.4.13 doesn't handle 10/100 negotiation properly. (This firmware is the same as what was in the tree previously, with the addition of header splitting support.) sys/jumbo.h: Jumbo buffer allocator interface. sys/mbuf.h: Add a new external mbuf type, EXT_DISPOSABLE, to indicate that the payload buffer can be thrown away / flipped to a userland process. socketvar.h: Add prototype for socow_setup. tiio.h: ioctl interface to the character portion of the ti(4) driver, plus associated structure/type definitions. uio.h: Change prototype for uiomoveco() so that we'll know whether the source page is disposable. ufs_readwrite.c:Update for new prototype of uiomoveco(). vm_fault.c: In vm_fault(), check to see whether we need to do a page based copy on write fault. vm_object.c: Add a new function, vm_object_allocate_wait(). This does the same thing that vm_object allocate does, except that it gives the caller the opportunity to specify whether it should wait on the uma_zalloc() of the object structre. This allows vm objects to be allocated while holding a mutex. (Without generating WITNESS warnings.) vm_object_allocate() is implemented as a call to vm_object_allocate_wait() with the malloc flag set to M_WAITOK. vm_object.h: Add prototype for vm_object_allocate_wait(). vm_page.c: Add page-based copy on write setup, clear and fault routines. vm_page.h: Add page based COW function prototypes and variable in the vm_page structure. Many thanks to Drew Gallatin, who wrote the zero copy send and receive code, and to all the other folks who have tested and reviewed this code over the years.
2002-06-26 03:37:47 +00:00
ti*) unit=`expr $i : 'ti\(.*\)'`
chr=153
mknod ti$unit c $chr `unit2minor $unit`
chmod 600 ti$unit
;;
ttyx?|ttyy?|ttyz?)
case $i in
1995-03-12 15:25:32 +00:00
*0) unit=0;; *1) unit=1;; *2) unit=2;; *3) unit=3;;
*4) unit=4;; *5) unit=5;; *6) unit=6;; *7) unit=7;;
*8) unit=8;; *9) unit=9;; *a) unit=10;; *b) unit=11;;
*c) unit=12;; *d) unit=13;; *e) unit=14;; *f) unit=15;;
esac
case $i in
ttyy?) unit=$(($unit + 16));;
ttyz?) unit=$(($unit + 32));;
esac
mknod $i c 42 $unit
;;
cronyx)
mknod cronyx c 42 63
1995-03-12 15:25:32 +00:00
;;
1995-01-25 21:21:28 +00:00
joy)
mknod joy0 c 51 0 root:operator
mknod joy1 c 51 1 root:operator
chmod 640 joy0 joy1
1995-01-25 21:21:28 +00:00
;;
spigot)
1995-07-30 12:56:26 +00:00
mknod spigot c 11 0
chmod 444 spigot
;;
ctx?)
unit=`expr $i : 'ctx\(.*\)'`
mknod ctx$unit c 40 `unit2minor $unit`
chmod 444 ctx$unit
;;
meteor?)
unit=`expr $i : 'meteor\(.*\)'`
mknod meteor$unit c 67 `unit2minor $unit`
chmod 444 meteor$unit
;;
bktr?)
unit=`expr $i : 'bktr\(.*\)'`
mknod bktr$unit c 92 `unit2minor $unit`
mknod tuner$unit c 92 `unit2minor $((16 + $unit))`
mknod vbi$unit c 92 `unit2minor $((32 + $unit))`
chmod 444 bktr$unit tuner$unit vbi$unit
;;
tun*)
units=`expr $i : 'tun\(.*\)$'`
unit=0
while [ $unit -le $units ]; do
mknod tun$unit c 52 `unit2minor $unit`
unit=$(($unit + 1))
done
;;
tap*)
units=`expr $i : 'tap\(.*\)$'`
unit=0
while [ $unit -le $units ]; do
mknod tap$unit c 149 `unit2minor $unit` root:network
unit=$(($unit + 1))
done
;;
1996-09-08 23:56:27 +00:00
sysmouse)
mknod sysmouse c 12 128
mknod consolectl c 12 255
1996-09-08 23:56:27 +00:00
;;
jogdial)
mknod jogdial c 160 0
;;
1995-02-14 21:13:14 +00:00
snp?)
unit=`expr $i : 'snp\(.*\)'`
mknod snp$unit c 53 `unit2minor $unit`
1995-02-14 21:13:14 +00:00
;;
# dufault@hda.com: If I do much more work on other A-D boards
# then eventually we'll have an "ad" and "dio" interface and some of these
# "labpcaio" ones will be gone.
# labpcaio: D-A and A-D.
# labpcdio: Digital in and Digital out.
#
labpc*)
umask 7
case $i in
labpcaio*)
name=labpcaio
unit=`expr $i : 'labpcaio\(.*\)'`
all="0 1 2 3 4 5 6 7"
offset=0
;;
labpcdio*)
name=labpcdio
unit=`expr $i : 'labpcdio\(.*\)'`
all="0 1 2 3"
offset=8
;;
*)
die 3 "Don't know LabPC type $i"
;;
esac
if [ -z "${unit}" ]; then
unit=all
fi
case $unit in
0|1|2|3|4|5|6|7)
mknod $name$unit c 66 $(($offset + $unit))
;;
all)
for i in $all
do
mknod $name$i c 66 $(($offset + $i))
done
;;
*)
echo "No such LabPC unit: $unit"
;;
esac
umask 77
;;
1996-03-26 21:04:54 +00:00
perfmon)
mknod perfmon c 2 32 root:kmem
chmod 640 perfmon
1996-03-26 21:04:54 +00:00
;;
2000-01-13 20:27:22 +00:00
ipl)
mknod ipl c 79 0
mknod ipnat c 79 1
mknod ipstate c 79 2
mknod ipauth c 79 3
;;
1999-01-06 16:18:05 +00:00
kbd*)
unit=`expr $i : 'kbd\(.*\)'`
chr=112
mknod kbd$unit c $chr `unit2minor $unit`
1999-01-06 16:18:05 +00:00
;;
i4b)
mknod i4b c 60 0
;;
i4bctl)
mknod i4bctl c 55 0
;;
i4brbch*)
unit=`expr $i : 'i4brbch\(.*\)'`
mknod i4brbch$unit c 57 `unit2minor $unit`
;;
i4bteld*)
offset=64
unit=`expr $i : 'i4bteld\(.*\)'`
mknod i4bteld$unit c 56 `unit2minor $(($offset + $unit))`
;;
i4btel*)
unit=`expr $i : 'i4btel\(.*\)'`
mknod i4btel$unit c 56 `unit2minor $unit`
;;
i4btrc*)
unit=`expr $i : 'i4btrc\(.*\)'`
mknod i4btrc$unit c 59 `unit2minor $unit`
;;
2000-09-13 05:03:02 +00:00
aac*)
unit=`expr $i : 'aac\(.*\)'`
mknod aac$unit c 150 `unit2minor $unit`
ln -fs aac$unit afa$unit
ln -fs aac$unit hpn$unit
2000-09-13 05:03:02 +00:00
;;
mlx*)
unit=`expr $i : 'mlx\(.*\)'`
mknod mlx$unit c 130 `unit2minor $unit`
;;
2001-02-25 22:52:55 +00:00
mly*)
unit=`expr $i : 'mlx\(.*\)'`
mknod mlx$unit c 158 `unit2minor $unit`
;;
2000-11-28 21:53:42 +00:00
amr*)
unit=`expr $i : 'amr\(.*\)'`
mknod amr$unit c 132 `unit2minor $unit`
;;
ciss*)
unit=`expr $i : 'ciss\(.*\)'`
mknod ciss$unit c 166 `unit2minor $unit`
;;
3dfx*)
unit=`expr $i : '3dfx\(.*\)'`
mknod 3dfx$unit c 107 `unit2minor $unit`
ln -sf 3dfx$unit 3dfx
2001-01-26 01:13:29 +00:00
ln -sf 3dfx$unit voodoo
;;
agpgart)
mknod agpgart c 148 0
;;
twe*)
unit=`expr $i : 'twe\(.*\)'`
mknod twe$unit c 146 `unit2minor $unit`
;;
tw*)
unit=`expr $i : 'tw\(.*\)'`
mknod tw$unit c 19 `unit2minor $unit` root:operator
;;
cfs*)
unit=`expr $i : 'cfs\(.*\)'`
mknod cfs$unit c 93 $unit root:operator
;;
nsmb*)
unit=`expr $i : 'nsmb\(.*\)'`
mknod nsmb$unit c 144 $unit
;;
elan*)
mknod elan-mmcr c 100 0 # XXX local major
chmod 600 elan-mmcr
;;
2002-10-04 20:44:46 +00:00
crypto)
mknod crypto c 70 0 root:operator
chmod 666 crypto
;;
2002-12-31 06:38:35 +00:00
fwmem*)
unit=`expr $i : 'fwmem\(.*\)'`
mknod fwmem$unit c 127 $((1<<24 | $unit)) root:operator
chmod 660 fwmem$unit
;;
fw*)
unit=`expr $i : 'fw\(.*\)'`
mknod fw$unit c 127 $unit root:operator
chmod 660 fw$unit
;;
local)
umask 0 # XXX should be elsewhere
sh $0.local
umask 77
;;
*)
echo $i - no such device name
;;
esac
done