MAKEDEV.tmpl revision 1.48
1#!/bin/sh -
2#	$NetBSD: MAKEDEV.tmpl,v 1.48 2005/09/27 02:44:12 jmcneill Exp $
3#
4# Copyright (c) 2003 The NetBSD Foundation, Inc.
5# All rights reserved.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions
9# are met:
10# 1. Redistributions of source code must retain the above copyright
11#    notice, this list of conditions and the following disclaimer.
12# 2. Redistributions in binary form must reproduce the above copyright
13#    notice, this list of conditions and the following disclaimer in the
14#    documentation and/or other materials provided with the distribution.
15# 3. All advertising materials mentioning features or use of this software
16#    must display the following acknowledgement:
17#        This product includes software developed by the NetBSD
18#        Foundation, Inc. and its contributors.
19# 4. Neither the name of The NetBSD Foundation nor the names of its
20#    contributors may be used to endorse or promote products derived
21#    from this software without specific prior written permission.
22#
23# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
24# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
25# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
27# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33# POSSIBILITY OF SUCH DAMAGE.
34#
35#
36###########################################################################
37#
38#   PLEASE RUN "cd ../share/man/man8 ; make makedevs"
39#   AFTER CHANGING THIS FILE, AND COMMIT THE UPDATED MANPAGE!
40#
41###########################################################################
42#
43# Device "make" file.  Valid special arguments:
44#	all	makes all known devices, including local devices.
45#		Tries to make the 'standard' number of each type.
46#	init	A set of devices that is used for MFS /dev by init.
47#		May be equal to "all".
48#	floppy	devices to be put on install floppies
49#	ramdisk	devices to be put into INSTALL kernel ramdisks.
50#	std	standard devices
51#	local	configuration specific devices
52#	wscons	make wscons devices
53#	usbs	make USB devices
54#	isdns	make ISDN devices
55#
56# Tapes:
57#	st*	SCSI tapes
58#	wt*	QIC-interfaced (e.g. not SCSI) 3M cartridge tape
59#	ht*	MASSBUS TM03 and TU??
60#	mt*	MSCP tapes (e.g. TU81, TK50)
61#	tm*	UNIBUS TM11 and TE10 emulations (e.g. Emulex TC-11)
62#	ts*	UNIBUS TS11
63#	ut*	UNIBUS TU45 emulations (e.g. si 9700)
64#	uu*	TU58 cassettes on DL11 controller
65#
66# Disks:
67#	ccd*	concatenated disk devices
68#	cd*	SCSI or ATAPI CD-ROM
69#	cgd*	cryptographic disk devices
70#	raid*	RAIDframe disk devices
71#	sd*	SCSI disks
72#	wd*	"winchester" disk drives (ST506,IDE,ESDI,RLL,...)
73#	bmd*	Nereid bank memory disks
74#	ed*	IBM PS/2 ESDI disk devices
75#	fd*	"floppy" disk drives (3 1/2", 5 1/4")
76#	fss*	Files system snapshot devices
77#	gdrom*	Dreamcast "gigadisc" CD-ROM drive
78#	hk*	UNIBUS RK06 and RK07
79#	hp*	MASSBUS RM??
80#	ld*	Logical disk devices (e.g., hardware RAID)
81#	mcd*	Mitsumi CD-ROM
82#	md*	memory pseudo-disk devices
83#	ofdisk*	OpenFirmware disk devices
84#	ra*	MSCP disks (RA??, RD??)
85#	rb*	730 IDC w/ RB80 and/or RB02
86#	rd*	HDC9224 RD disks on VS2000
87#	rl*	UNIBUS RL02
88#	rx*	MSCP floppy disk (RX33/50/...)
89#	up*	other UNIBUS devices (e.g. on Emulex SC-21V controller)
90#	vnd*	"file" pseudo-disks
91#	xbd*	Xen virtual disks
92#	xd*	Xylogic 753/7053 disks
93#	xy*	Xylogic 450/451 disks
94#
95# Pointing devices:
96#	wsmouse* wscons mouse events
97#	lms*	Logitech bus mouse
98#	mms*	Microsoft bus mouse
99#	qms*	"quadrature mouse"
100#	pms*	PS/2 mouse
101#	mouse	mouse (provides events, for X11)
102#
103# Keyboard devices:
104#	wskbd*	wscons keyboard events
105#	kbd	raw keyboard (provides events, for X11)
106#	kbdctl	keyboard control
107#
108# Terminals/Console ports:
109#	tty[01]*	standard serial ports
110#	tty0*	SB1250 ("sbscn") serial ports (sbmips)
111#	ttyE*	wscons - Workstation console ("wscons") glass-tty emulators
112#	ttyCZ?	Cyclades-Z multiport serial boards.  Each "unit"
113#		makes 64 ports.
114#	ttyCY?	Cyclom-Y multiport serial boards. Each "unit" makes
115#		32 ports.
116#	ttye*	ITE bitmapped consoles
117#	ttyv0	pccons
118#	ttyC?	NS16550 ("com") serial ports
119#	ttyS*	SA1110 serial port (hpcarm)
120#	ttyTX?	TX39 internal serial ports (hpcmips)
121#	ttyB?	DEC 3000 ZS8530 ("scc") serial ports (alpha)
122#	ttyA*	mfc serial ports (amiga)
123#	ttyB*	msc serial ports (amiga)
124#	ttyC*	com style serial ports (DraCo, HyperCom) (amiga)
125#		On the DraCo, units 0 and 1 are the built-in "modem" and
126#		"mouse" ports, if configured.
127#	ttyA0   8530 Channel A (formerly ser02) (atari)
128#	ttyA1	8530 Channel B (formerly mdm02) (atari)
129#	ttyB0	UART on first 68901 (formerly mdm01) (atari)
130#	ixpcom	IXP12x0 COM ports
131#	epcom	EP93xx COM ports
132#	ttyM?	HP200/300 4 port serial mux interface (hp300)
133#	ttya	"ttya" system console (luna68k)
134#	ttyb	second system serial port (luna68k)
135#	tty*	Onboard serial ports (mvme68k)
136#		On the mvme147 these are: ttyZ1, ttyZ2 and ttyZ3.
137#		On the mvme167, and '177: ttyC1, ttyC2 and ttyC3.
138#		Note that tty[CZ]0 is grabbed by the console device
139#		so is not created by default
140#	dc*	PMAX 4 channel serial interface (kbd, mouse, modem, printer)
141#	scc*	82530 serial interface (pmax)
142#	ttyZ*	Zilog 8530 ("zstty") serial ports
143#	tty[abcd]	Built-in serial ports (sparc)
144#	tty*	Z88530 serial controllers (sparc64)
145#	ttyh*	SAB82532 serial controllers (sparc64)
146#	tty[a-j]	Built-in serial ports (sun2, sun3)
147#	ttyC?	pccons (arc)
148#	dz*	UNIBUS DZ11 and DZ32 (vax)
149#	dh*	UNIBUS DH11 and emulations (e.g. Able DMAX, Emulex CS-11) (vax)
150#	dmf*	UNIBUS DMF32 (vax)
151#	dhu*    UNIBUS DHU11 (vax)
152#	dmz*    UNIBUS DMZ32 (vax)
153#	dl*	UNIBUS DL11 (vax)
154#	xencons	Xen virtual console
155#
156# Terminal multiplexors:
157#	dc*	4 channel serial interface (keyboard, mouse, modem, printer)
158#	dh*	UNIBUS DH11 and emulations (e.g. Able DMAX, Emulex CS-11)
159#	dhu*	UNIBUS DHU11
160#	dl*	UNIBUS DL11
161#	dmf*	UNIBUS DMF32
162#	dmz*	UNIBUS DMZ32
163#	dz*	UNIBUS DZ11 and DZ32
164#	scc*	82530 serial interface
165#
166# Call units:
167#	dn*	UNIBUS DN11 and emulations (e.g. Able Quadracall)
168#
169# Pseudo terminals:
170#	ptm	pty multiplexor device.
171#	pty*	set of 16 master and slave pseudo terminals
172#	opty	first 16 ptys, to save inodes on install media
173#	ipty	first 2 ptys, for install media use only
174#
175# Printers:
176#	arcpp*	Archimedes parallel port
177#	lpt*	stock lp
178#	lpa*	interruptless lp
179#	par*	Amiga motherboard parallel port
180#
181# USB devices:
182#	usb*	USB control devices
183#	uhid*	USB generic HID devices
184#	ulpt*	USB printer devices
185#	ugen*	USB generic devices
186#	urio*	USB Diamond Rio 500 devices
187#	uscanner*	USB scanners
188#	ttyU*	USB modems
189#	ttyY*	USB serial adapters
190#
191# ISDN devices:
192#	isdn	communication between userland isdnd and kernel
193#	isdnctl	control device
194#	isdnbchan* raw b-channel access
195#	isdntel*	telephony device
196#	isdnteld*	telephony dialout device
197#	isdntrc*	trace device
198#
199# Video devices:
200#	bwtwo*	monochromatic frame buffer
201#	cgtwo*	8-bit color frame buffer
202#	cgthree*	8-bit color frame buffer
203#	cgfour*	8-bit color frame buffer
204#	cgsix*	accelerated 8-bit color frame buffer
205#	cgeight*	24-bit color frame buffer
206#	etvme	Tseng et-compatible cards on VME (atari)
207#	ik*	UNIBUS interface to Ikonas frame buffer
208#	leo	Circad Leonardo VME-bus true color (atari)
209#	ps*	UNIBUS interface to Picture System 2
210#	qv*	QVSS (MicroVAX) display
211#	tcx*	accelerated 8/24-bit color frame buffer
212#
213# Maple bus devices:
214#	maple	Maple bus control devices
215#	mlcd*	Maple bus LCD devices
216#	mmem*	Maple bus storage devices
217#
218# IEEE1394 bus devices:
219#	fw*	IEEE1394 bus generic node access devices
220#	fwmem*	IEEE1394 bus physical memory of the remote node access devices
221#
222# Special purpose devices:
223#	ad*	UNIBUS interface to Data Translation A/D converter
224#	agp*	AGP GART devices
225#	altq	ALTQ control interface
226#	apm	power management device
227#	audio*	audio devices
228#	bell*	OPM bell device (x68k)
229#	bktr	Brooktree 848/849/878/879 based TV cards
230#	bpf	packet filter
231#	cfs*	Coda file system device
232#	ch*	SCSI media changer
233#	cir*	Consumer IR
234#	clockctl clock control for non root users
235#	crypto	hardware crypto access driver
236#	dmoverio hardware-assisted data movers
237#	dpt*	DPT/Adaptec EATA RAID management interface
238#	dpti*	DPT/Adaptec I2O RAID management interface
239#	fb*	PMAX generic framebuffer pseudo-device
240#	fd	file descriptors
241#	grf*	graphics frame buffer device
242#	hil	HP300 HIL input devices
243#	icp	ICP-Vortex/Intel RAID control interface
244#	iic*	IIC bus device
245#	iop*	I2O IOP control interface
246#	ipl	IP Filter
247#	irframe* IrDA physical frame
248#	ite*	terminal emulator interface to HP300 graphics devices
249#	joy*	joystick device
250#	kttcp	kernel ttcp helper device
251#	lkm	loadable kernel modules interface
252#	magma*	Magma multiport serial/parallel cards
253#	midi*	MIDI
254#	mlx*	Mylex DAC960 control interface
255#	mly*	Mylex AcceleRAID/eXtremeRAID control interface
256#	np*	UNIBUS Ethernet co-processor interface, for downloading.
257#	nsmb*	SMB requester
258#	openfirm OpenFirmware accessor
259#	pci*	PCI bus access devices
260#	pf	PF packet filter
261#	pow*	power management device (x68k)
262#	px*	PixelStamp Xserver access
263#	radio*	radio devices
264#	random	Random number generator
265#	rtc*	RealTimeClock
266#	satlink* PlanetConnect satellite receiver driver
267#	scsibus* SCSI busses
268#	se*	SCSI Ethernet
269#	ses*	SES/SAF-TE SCSI Devices
270#	speaker	PC speaker		(XXX - installed)
271#	sram	battery backuped memory (x68k)
272#	ss*	SCSI scanner
273#	stic*	PixelStamp interface chip
274#	sysmon	System Monitoring hardware
275#	systrace syscall tracer
276#	tap*	virtual Ethernet device
277#	tun*	network tunnel driver
278#	twe	3ware Escalade control interface
279#	uk*	unknown SCSI device
280#	veriexec verified executable fingerprint loader
281#	vmegen*	generic VME access
282#	view*	generic interface to graphic displays (Amiga)
283#	wsfont*	console font control
284#	wsmux*	wscons event multiplexor
285#	xenevt	Xen event interface
286
287
288PATH=/sbin:/usr/sbin:/bin:/usr/bin:/rescue
289
290
291usage()
292{
293	cat 1>&2 << _USAGE_
294Usage: ${0##*/} [-f] [-m mknod] [-s]  special [...]
295	Create listed special devices.  Options:
296	-f		Force permissions to be updated on existing devices.
297	-m mknod	Name of mknod(8) program.  [\$TOOL_MKNOD or mknod]
298	-s		Generate mtree(8) specfile instead of creating devices.
299
300_USAGE_
301	exit 1
302}
303
304# zeropad width number
305#	display number with a zero (`0') padding of width digits.
306#
307zeropad()
308{
309	case $(($1 - ${#2})) in
310	5)	echo 00000$2;;
311	4)	echo 0000$2;;
312	3)	echo 000$2;;
313	2)	echo 00$2;;
314	1)	echo 0$2;;
315	0)	echo $2;;
316	*)	echo "$0: bad padding" 1>&2; exit 1;;
317	esac
318}
319
320# hexprint number
321#	display (base10) number as hexadecimal
322#
323hexprint()
324{
325	case $1 in
326	[0-9])	echo $1 ;;
327	10)	echo a ;;
328	11)	echo b ;;
329	12)	echo c ;;
330	13)	echo d ;;
331	14)	echo e ;;
332	15)	echo f ;;
333	*)	echo $(hexprint $(($1 / 16)))$(hexprint $(($1 % 16))) ;;
334	esac
335}
336
337do_force=false
338do_specfile=false
339while getopts fm:s ch; do
340	case ${ch} in
341	f)	do_force=true ;;
342	m)	TOOL_MKNOD=${OPTARG} ;;
343	s)	do_specfile=true ;;
344	*)	usage ;;
345	esac
346done
347shift $((${OPTIND} - 1))
348[ $# -gt 0 ] || usage
349
350
351MKNOD="${TOOL_MKNOD:-mknod} -F netbsd"
352if $do_force; then
353	MKNOD="${MKNOD} -R"
354else
355	MKNOD="${MKNOD} -r"
356fi
357
358u_root="%uid_root%"
359u_uucp="%uid_uucp%"
360g_kmem="%gid_kmem%"
361g_ntpd="%gid_ntpd%"
362g_operator="%gid_operator%"
363g_wheel="%gid_wheel%"
364dialin=0
365dialout=524288
366callunit=262144
367
368# only allow read&write for owner by default
369umask 077
370
371# Check if we have fdesc mounted
372if [ -d fd ]; then
373        case "`df fd`" in
374        *fdesc*)	nofdesc=false;;
375        *)		nofdesc=true;;
376        esac
377else
378        nofdesc=true
379fi
380
381
382if $do_specfile; then
383	echo ". type=dir"
384fi
385
386
387#
388# functions available to create nodes:
389#
390# mkdev name [b|c] major minor [mode{=600} [gid{=0} [uid{=0}]]]
391#	create device node `name' with the appropriate permissions
392#
393# lndev src target
394#	create a symlink from src to target
395#
396# makedir dir mode
397#	create directory with appropriate mode
398#
399
400mkdev()
401{
402	if $do_specfile; then
403		case $2 in
404		b)	type=block ;;
405		c)	type=char ;;
406		esac
407		echo "./$1 type=${type} device=netbsd,$3,$4 mode=${5:-600} gid=${6:-$g_wheel} uid=${7:-$u_root}"
408	else
409		${MKNOD} -m ${5:-600} -g \#${6:-$g_wheel} -u \#${7:-$u_root} $1 $2 $3 $4
410	fi
411}
412
413lndev()
414{
415	if $do_specfile; then
416		echo "./$2 type=link link=$1 mode=0700 gid=$g_wheel uid=$u_root"
417	else
418		ln -f -s $1 $2
419	fi
420}
421
422makedir()
423{
424	if $do_specfile; then
425		echo "./$1 type=dir mode=$2 gid=$g_wheel uid=$u_root"
426	else
427		mkdir $1 2>/dev/null
428		chmod $2 $1
429	fi
430}
431
432warn()
433{
434	echo 1>&2 "$0: $*"
435}
436
437
438
439# makedev special [...]
440#	the main loop
441#
442
443makedev()
444{
445
446for i
447do
448
449case $i in
450
451%MD_DEVICES%
452
453all)
454	makedev all_md
455	makedev std fd ptm pty0 pty1 pty2 pty3
456	makedev ccd0 ccd1 ccd2 ccd3
457	makedev cgd0 cgd1 cgd2 cgd3
458	makedev fss0 fss1 fss2 fss3
459	makedev md0 md1
460	makedev raid0 raid1 raid2 raid3 raid4 raid5 raid6 raid7
461	makedev vnd0 vnd1 vnd2 vnd3
462	makedev bpf
463	makedev tun0 tun1 tun2 tun3
464	makedev ipl pf crypto random systrace
465	makedev lkm clockctl
466	makedev local
467	makedev atabus0 atabus1 atabus2 atabus3
468	makedev tap tap0 tap1 tap2 tap3
469	makedev gpio gpio0 gpio1 gpio2 gpio3
470	;;
471
472init)
473	# unless overridden by MD entry, this is equal to 'all'
474	makedev all
475	;;
476
477%MI_DEVICES_BEGIN%
478audio)
479	makedev audio0 audio1 audio2 audio3
480	lndev sound0 sound
481	lndev audio0 audio
482	lndev mixer0 mixer
483	lndev audioctl0 audioctl
484	;;
485
486gpio)
487	makedev gpio0 gpio1 gpio2 gpio3
488	lndev gpio0 gpio
489	;;
490
491radio)
492	makedev radio0 radio1
493	lndev radio0 radio
494	;;
495
496ramdisk)
497	makedev floppy md0
498	;;
499
500usbs)
501	makedev usb usb0 usb1 usb2 usb3 usb4 usb5 usb6 usb7
502	makedev uhid0 uhid1 uhid2 uhid3
503	makedev ulpt0 ulpt1
504	makedev ttyU0 ttyU1
505	makedev ttyY0 ttyY1
506	makedev urio0
507	makedev uscanner0 uscanner1
508	makedev ugen0
509	;;
510
511isdns)
512	makedev isdn isdnctl isdnbchan0 isdnbchan1 isdntel0 isdntel1 isdnteld0 isdnteld1 isdntrc0 isdntrc1
513	;;
514
515std)
516	mkdev		console	c %cons_chr% 0	600
517	mkdev		constty	c %cons_chr% 1	600
518	mkdev		drum	c %swap_chr% 0	640 $g_kmem
519	mkdev		kmem	c %mem_chr% 1	640 $g_kmem
520	mkdev		mem	c %mem_chr% 0	640 $g_kmem
521	mkdev		null	c %mem_chr% 2	666
522	mkdev		zero	c %mem_chr% 12	666
523	mkdev		klog	c %log_chr% 0	600
524	mkdev		ksyms	c %ksyms_chr% 0	444
525	if $nofdesc; then
526		mkdev	tty	c %ctty_chr% 0		666
527		mkdev	stdin	c %filedesc_chr% 0	666
528		mkdev	stdout	c %filedesc_chr% 1	666
529		mkdev	stderr	c %filedesc_chr% 2	666
530	fi
531	;;
532
533usb)
534	mkdev usb c %usb_chr% 255 444
535	;;
536
537usb*)
538	unit=${i#usb}
539	usb=usb$unit
540	mkdev usb$unit c %usb_chr% $unit
541	;;
542
543uhid*)
544	unit=${i#uhid}
545	mkdev uhid$unit c %uhid_chr% $unit 666
546	;;
547
548ulpt*)
549	unit=${i#ulpt}
550	mkdev ulpt$unit c %ulpt_chr% $unit
551	mkdev ulpn$unit c %ulpt_chr% $(($unit + 64))
552	;;
553
554urio*)
555	unit=${i#urio}
556	mkdev urio$unit c %urio_chr% $unit 666
557	;;
558
559uscanner*)
560	unit=${i#uscanner}
561	mkdev uscanner$unit c %uscanner_chr% $unit
562	;;
563
564ttyY*)
565	unit=${i#ttyY}
566	mkdev ttyY$unit c %ucycom_chr% $(($unit + $dialin  )) "" "" $u_uucp
567	mkdev dtyY$unit c %ucycom_chr% $(($unit + $dialout )) "" "" $u_uucp
568	mkdev ctyY$unit c %ucycom_chr% $(($unit + $callunit)) "" "" $u_uucp
569	;;
570
571ttyU*)
572	unit=${i#ttyU}
573	mkdev ttyU$unit c %ucom_chr% $(($unit + $dialin  )) "" "" $u_uucp
574	mkdev dtyU$unit c %ucom_chr% $(($unit + $dialout )) "" "" $u_uucp
575	mkdev ctyU$unit c %ucom_chr% $(($unit + $callunit)) "" "" $u_uucp
576	;;
577
578ugen*)
579	unit=${i#ugen}
580	for j in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
581	do
582		mkdev ugen$unit.$j c %ugen_chr% $(($unit * 16 + ${j#0}))
583	done
584	;;
585
586wscons)
587	makedev ttyE0 ttyE1 ttyE2 ttyE3 ttyE4 ttyE5 ttyE6 ttyE7
588	makedev wsmouse0 wsmouse1 wsmouse2 wsmouse3
589	makedev wskbd0 wskbd1 wskbd2 wskbd3
590	makedev wsmux0 wsmux1 wsmux2 wsmux3
591	makedev wsmouse wskbd
592	makedev ttyEcfg ttyEstat
593	makedev wsfont
594	;;
595
596wsmouse)
597	mkdev wsmouse c %wsmux_chr% 0
598	;;
599
600wskbd)
601	mkdev wskbd c %wsmux_chr% 1
602	;;
603
604wsmux*)
605	unit=${i#wsmux}
606	mkdev wsmux$unit    c %wsmux_chr% $unit
607	mkdev wsmuxctl$unit c %wsmux_chr% $(($unit + 128)) 200
608	;;
609
610xenevt)
611	mkdev xenevt c %xenevt_chr% 0
612	;;
613
614xencons)
615	mkdev xencons c %xencons_chr% 0
616	;;
617
618ttyEstat)
619	mkdev ttyEstat c %wsdisplay_chr% 254
620	;;
621
622ttyEcfg)
623	mkdev ttyEcfg c %wsdisplay_chr% 255
624	;;
625
626ttyE*)
627	unit=${i#ttyE}
628	mkdev ttyE$unit c %wsdisplay_chr% $unit
629	;;
630
631wsmouse*)
632	unit=${i#wsmouse}
633	mkdev wsmouse$unit c %wsmouse_chr% $unit
634	;;
635
636wskbd*)
637	unit=${i#wskbd}
638	mkdev wskbd$unit c %wskbd_chr% $unit
639	;;
640
641fd)
642	if $nofdesc; then
643		makedir fd 755
644		n=0
645		while [ $n -lt 64 ]
646		do
647			mkdev fd/$n c %filedesc_chr% $n 666
648			n=$(($n + 1))
649		done
650	fi
651	;;
652
653wt*)
654	case $i in
655	wt*) name=wt;  unit=${i#wt};	chr=%wt_chr%;	blk=%wt_blk%;;
656	esac
657	for sub in $unit $(($unit+8)) $(($unit+16))
658	do
659		mkdev $name$sub		b $blk $(($sub + 0)) 660 $g_operator
660		mkdev n$name$sub	b $blk $(($sub + 4)) 660 $g_operator
661		mkdev r$name$sub	c $chr $(($sub + 0)) 660 $g_operator
662		mkdev nr$name$sub	c $chr $(($sub + 4)) 660 $g_operator
663	done
664	;;
665
666md*)
667	makedisk_minimal md ${i#md} %md_blk% %md_chr%
668	;;
669
670fss*)
671	case $i in
672	fss*) name=fss; unit=${i#fss};	blk=%fss_blk%;	chr=%fss_chr%
673	esac
674	mkdev $name$unit	b $blk $unit 660 $g_operator
675	mkdev r$name$unit	c $chr $unit 660 $g_operator
676	;;
677
678ss*)
679	case $i in
680	ss*) name=ss;	unit=${i#ss};	chr=%ss_chr%;;
681	esac
682	mkdev $name$unit	c $chr $(($unit * 16 + 0)) 640 $g_operator
683	mkdev n$name$unit	c $chr $(($unit * 16 + 1)) 640 $g_operator
684	mkdev en$name$unit	c $chr $(($unit * 16 + 3)) 640 $g_operator
685	;;
686
687ccd*|cgd*|raid*|vnd*)
688	case $i in
689	ccd*)	name=ccd;	unit=${i#ccd};	blk=%ccd_blk%;	chr=%ccd_chr%;;
690	cgd*)	name=cgd;	unit=${i#cgd};	blk=%cgd_blk%;	chr=%cgd_chr%;;
691	raid*)	name=raid;	unit=${i#raid}; blk=%raid_blk%; chr=%raid_chr%;;
692	vnd*)	name=vnd;	unit=${i#vnd};	blk=%vnd_blk%;	chr=%vnd_chr%;;
693	esac
694	%MKDISK% $name $unit $blk $chr
695	;;
696
697sd*)
698	name=sd; unit=${i#sd};	blk=%sd_blk%;	chr=%sd_chr%
699	%MKDISK% $name $unit $blk $chr
700	;;
701
702wd*)
703	name=wd; unit=${i#wd}; blk=%wd_blk%; chr=%wd_chr%
704	%MKDISK% $name $unit $blk $chr
705	;;
706
707fd*)
708	name=fd; unit=${i#fd}; blk=%fd_blk%; chr=%fd_chr%
709	%MKDISK% $name $unit $blk $chr
710	;;
711
712ld*)
713	name=ld; unit=${i#ld}; blk=%ld_blk%; chr=%ld_chr%
714	%MKDISK% $name $unit $blk $chr
715	;;
716
717ed*)
718	name=ed; unit=${i#ed}; blk=%ed_blk%; chr=%ed_chr%
719	%MKDISK% $name $unit $blk $chr
720	;;
721
722ofdisk*)
723	name=ofdisk; unit=${i#ofdisk}; blk=%ofdisk_blk%; chr=%ofdisk_chr%
724	%MKDISK% $name $unit $blk $chr
725	;;
726
727xbd*)
728	name=xbd; unit=${i#xbd}; blk=%xbd_blk%; chr=%xbd_chr%
729	%MKDISK% $name $unit $blk $chr
730	;;
731
732ttyCY*)
733	name=tyCY; chr=%cy_chr%; off=32
734	unit=${i#t${name}}
735	minor=$(($unit * $off))
736	eminor=$(($minor + $off))
737	while [ $minor -lt $eminor ]
738	do
739		nminor=$(zeropad 3 $minor)
740		mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp
741		mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp
742		minor=$(($minor + 1))
743	done
744	;;
745
746ttyCZ*)
747	name=tyCZ; chr=%cz_chr%; off=64
748	unit=${i#t${name}}
749	minor=$(($unit * $off))
750	eminor=$(($minor + $off))
751	while [ $minor -lt $eminor ]
752	do
753		nminor=$(zeropad 4 $minor)
754		mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp
755		mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp
756		minor=$(($minor + 1))
757	done
758	;;
759
760
761tty[0-9]|tty0[0-9])
762	# some archs have built-in zstty (major %zstty_chr%) instead
763	# of NS16550; create ttyZ* and hardlink as [dt]ty0*; this
764	# needs to be before com entry, for archs which have both
765	unit=${i#tty}
766	unit=$(($unit + 0))
767	makedev ttyZ${unit}
768	lndev ttyZ$unit tty0${unit}
769	lndev dtyZ$unit dty0${unit}
770	;;
771
772tty0*|tty1*|tty[0-9])
773	unit=${i#tty}
774	ounit=$(zeropad 2 $unit)
775	mkdev tty$ounit c %com_chr% $(($unit + $dialin )) "" "" $u_uucp
776	mkdev dty$ounit c %com_chr% $(($unit + $dialout)) "" "" $u_uucp
777	;;
778
779ttyC*)
780		# some archs call com_chr ttyC traditionally
781	unit=${i#ttyC}; name=ttyC; dname=dtyC; chr=%com_chr%
782	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
783	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
784	;;
785
786ttyh*)
787	unit=${i#ttyh}; name=ttyh; dname=dtyh; chr=%sabtty_chr%
788	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
789	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
790	;;
791
792ttyTX*)
793	unit=${i#ttyTX}; name=ttyTX0; dname=dtyTX0; chr=%txcom_chr%
794	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
795	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
796	;;
797
798ttyZ*)
799	unit=${i#ttyZ}; name=ttyZ; dname=dtyZ; chr=%zstty_chr%
800	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
801	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
802	;;
803
804opty)
805	for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f
806	do
807		case $j in
808		[0-9])	jn=$j ;;
809		a)	jn=10 ;;
810		b)	jn=11 ;;
811		c)	jn=12 ;;
812		d)	jn=13 ;;
813		e)	jn=14 ;;
814		f)	jn=15 ;;
815		esac
816		mkdev ttyp$j c %pts_chr% $jn 666
817		mkdev ptyp$j c %ptc_chr% $jn 666
818	done
819	;;
820
821pty*)
822	class=${i#pty}
823	d1="p q r s t u v w x y z P Q R S T"
824	if [ "$class" -ge 64 ]
825	then
826		warn "$i: pty unit must be between 0 and 63"
827		continue
828	elif [ "$class" -lt 16 ]
829	then
830		offset=0
831		mult=0
832		d2="0 1 2 3 4 5 6 7 8 9 a b c d e f"
833	else
834		class=$(($class - 16))
835		offset=256
836		mult=2
837		d2="g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z"
838	fi
839	start=$(($class * 16))
840	set -- $d2
841	nt=$#
842	s1=$(($start / $nt))
843	set -- $d1
844	shift $s1
845	t1=$1
846	if [ "$t1" = v ]; then
847		warn "$i: pty unit conflicts with console ttyv0 device"
848		continue
849	fi
850	s2=$(($start % $nt - $s1 * $mult))
851	set -- $d2
852	shift $s2
853	t2=$1
854	unit=$(($start + $offset - $s1 * $mult))
855	end=$(($unit + 16))
856	while [ "$unit" -lt "$end" ]
857	do
858		mkdev tty$t1$t2 c %pts_chr% $unit 666
859		mkdev pty$t1$t2 c %ptc_chr% $unit 666
860		shift
861		t2=$1
862		if [ -z "$t2" ]
863		then
864			break
865		fi
866		unit=$(($unit + 1))
867	done
868	;;
869
870stic*)
871	unit=${i#stic}
872	mkdev stic$unit c %stic_chr% $unit
873	;;
874
875st*)
876	case $i in
877	st*) name=st;	unit=${i#st};	chr=%st_chr%;	blk=%st_blk%;;
878	esac
879	mkdev $name$unit	b $blk $(($unit * 16 + 0)) 660 $g_operator
880	mkdev n$name$unit	b $blk $(($unit * 16 + 1)) 660 $g_operator
881	mkdev e$name$unit	b $blk $(($unit * 16 + 2)) 660 $g_operator
882	mkdev en$name$unit	b $blk $(($unit * 16 + 3)) 660 $g_operator
883	mkdev r$name$unit	c $chr $(($unit * 16 + 0)) 660 $g_operator
884	mkdev nr$name$unit	c $chr $(($unit * 16 + 1)) 660 $g_operator
885	mkdev er$name$unit	c $chr $(($unit * 16 + 2)) 660 $g_operator
886	mkdev enr$name$unit	c $chr $(($unit * 16 + 3)) 660 $g_operator
887	;;
888
889ses*|ch*|uk*)
890	case $i in
891	ch*)	name=ch;	unit=${i#ch};	chr=%ch_chr%;;
892	uk*)	name=uk;	unit=${i#uk};	chr=%uk_chr%;;
893	ses*)	name=ses;	unit=${i#ses};	chr=%ses_chr%;;
894	esac
895	mkdev $name$unit c $chr $unit 640 $g_operator
896	;;
897
898cd*)
899	makedisk_minimal cd ${i#cd} %cd_blk% %cd_chr% %
900	;;
901
902mcd*)
903	makedisk_minimal mcd ${i#mcd} %mcd_blk% %mcd_chr%
904	;;
905
906gdrom*)
907	makedisk_minimal gdrom ${i#gdrom} %gdrom_blk% %gdrom_chr%
908	;;
909
910lpt*|lpa*)
911	case $i in
912	lpt*) name=lpt;	unit=${i#lpt};	chr=%lpt_chr%;	flags=0;;
913	lpa*) name=lpa;	unit=${i#lpa};	chr=%lpt_chr%;	flags=128;;
914	esac
915	mkdev $name$unit c $chr $(($unit + $flags))
916	mkdev lpt${unit}ctl c $chr $(($unit + 256))
917	;;
918
919bpf)
920	mkdev bpf	c %bpf_chr% 0
921	lndev bpf bpf0
922	;;
923
924tun*)
925	unit=${i#tun}
926	mkdev tun$unit c %tun_chr% $unit
927	;;
928
929joy*)
930	unit=${i#joy}
931	mkdev joy$unit c %joy_chr% $unit
932	;;
933
934ipl)
935	mkdev ipl	c %ipl_chr% 0
936	mkdev ipnat	c %ipl_chr% 1
937	mkdev ipstate	c %ipl_chr% 2
938	mkdev ipauth	c %ipl_chr% 3
939	;;
940
941pf)
942	mkdev pf c %pf_chr% 0
943	;;
944
945crypto)
946	mkdev crypto c %crypto_chr% 0 666
947	;;
948
949speaker)
950	mkdev speaker c %spkr_chr% 0
951	;;
952
953lkm)
954	mkdev lkm c %lkm_chr% 0 640 $g_kmem
955	;;
956
957audio*)
958	unit=${i#audio}
959	audio=audio$unit
960	sound=sound$unit
961	mixer=mixer$unit
962	audioctl=audioctl$unit
963	: ${unit:-0}
964	mkdev $sound    c %audio_chr% $(($unit + 0))	666
965	mkdev $audio    c %audio_chr% $(($unit + 128))	666
966	mkdev $mixer    c %audio_chr% $(($unit + 16))	666
967	mkdev $audioctl c %audio_chr% $(($unit + 192))	666
968	;;
969
970gpio*)
971	unit=${i#gpio}
972	mkdev gpio$unit c %gpio_chr% $unit 644
973	;;
974
975rmidi*)
976	unit=${i#rmidi}
977	mkdev rmidi$unit c %midi_chr% $unit 666
978	;;
979
980music*)
981	unit=${i#music}
982	: ${unit:-0}
983	mkdev music$unit     c %sequencer_chr% $(($unit + 0))	666
984	mkdev sequencer$unit c %sequencer_chr% $(($unit + 128))	666
985	;;
986
987radio*)
988	unit=${i#radio}
989	: ${unit:-0}
990	mkdev radio$unit c %radio_chr% $unit 666
991	;;
992
993apm)
994	mkdev apm	c %apm_chr% 0 644
995	mkdev apmctl	c %apm_chr% 8 644
996	;;
997
998apm)
999		# hpcmips uses `apmdev_chr' instead of `apm_chr'
1000	mkdev apm	c %apmdev_chr% 0 644
1001	mkdev apmctl	c %apmdev_chr% 8 644
1002	;;
1003
1004satlink*)
1005	unit=${i#satlink}
1006	mkdev satlink$unit c %satlink_chr% $unit 444
1007	;;
1008
1009random)
1010	mkdev random	c %rnd_chr% 0 444
1011	mkdev urandom	c %rnd_chr% 1 644
1012	;;
1013
1014cfs*)
1015	unit=${i#cfs}
1016	mkdev cfs$unit c %vcoda_chr% $unit
1017	;;
1018
1019sysmon)
1020	mkdev sysmon	c %sysmon_chr% 0 644
1021	mkdev watchdog	c %sysmon_chr% 1 644
1022	mkdev power	c %sysmon_chr% 2 640
1023	;;
1024
1025scsibus*)
1026	unit=${i#scsibus}
1027	mkdev scsibus$unit c %scsibus_chr% $unit 644
1028	;;
1029
1030bktr)
1031	makedev bktr0 bktr1
1032	lndev	bktr0	bktr
1033	lndev	tuner0	tuner
1034	lndev	vbi0	vbi
1035	;;
1036
1037bktr*)
1038	unit=${i#bktr}
1039	mkdev bktr$unit		c %bktr_chr% $(($unit + 0))	444
1040	mkdev tuner$unit	c %bktr_chr% $(($unit + 16))	444
1041	mkdev vbi$unit		c %bktr_chr% $(($unit + 32))	444
1042	;;
1043
1044iop*)
1045	unit=${i#iop}
1046	mkdev iop$unit c %iop_chr% $unit
1047	;;
1048
1049mlx*)
1050	unit=${i#mlx}
1051	mkdev mlx$unit c %mlx_chr% $unit
1052	;;
1053
1054mly*)
1055	unit=${i#mly}
1056	mkdev mly$unit c %mly_chr% $unit
1057	;;
1058
1059twe*)
1060	unit=${i#twe}
1061	mkdev twe$unit c %twe_chr% $unit
1062	;;
1063
1064icp*)
1065	unit=${i#icp}
1066	mkdev icp$unit c %icp_chr% $unit
1067	;;
1068
1069agp*)
1070	unit=${i#agp}
1071	mkdev agp$unit c %agp_chr% $unit 644
1072	if [ "$unit" = "0" ]; then
1073		lndev agp$unit agpgart
1074	fi
1075	;;
1076
1077pci*)
1078	unit=${i#pci}
1079	mkdev pci$unit c %pci_chr% $unit 644
1080	;;
1081
1082dpti*)
1083	unit=${i#dpti}
1084	mkdev dpti$unit c %dpti_chr% $unit
1085	;;
1086
1087dpt*)
1088	unit=${i#dpt}
1089	mkdev dpt$unit c %dpt_chr% $unit
1090	;;
1091
1092altq)
1093	makedir altq 755
1094	unit=0
1095	for dev in altq cbq wfq afm fifoq red rio localq hfsc cdnr blue priq
1096	do
1097		mkdev altq/$dev c %altq_chr% $unit 644
1098		unit=$(($unit + 1))
1099	done
1100	;;
1101
1102isdn)
1103	mkdev isdn c %isdn_chr% 0
1104	;;
1105
1106isdnctl)
1107	mkdev isdnctl c %isdnctl_chr% 0
1108	;;
1109
1110isdnbchan*)
1111	unit=${i#isdnbchan}
1112	mkdev isdnbchan$unit c %isdnbchan_chr% $unit
1113	;;
1114
1115isdnteld*)
1116	unit=${i#isdnteld}
1117	mkdev isdnteld$unit c %isdntel_chr% $(($unit + 64))
1118	;;
1119
1120isdntel*)
1121	unit=${i#isdntel}
1122	mkdev isdntel$unit c %isdntel_chr% $unit
1123	;;
1124
1125isdntrc*)
1126	unit=${i#isdntrc}
1127	mkdev isdntrc$unit c %isdntrc_chr% $unit
1128	;;
1129
1130vmegen)
1131	makedev vmegen0 vmegen1 vmegen2 vmegen3
1132	;;
1133
1134vmegen*)
1135	unit=${i#vmegen}
1136	mkdev vmegen$unit c %vmegeneric_chr% $(($unit * 16 + 0))
1137	;;
1138
1139wsfont)
1140	mkdev wsfont c %wsfont_chr% 0
1141	;;
1142
1143cir*)
1144	unit=${i#cir}
1145	mkdev cir$unit c %cir_chr% $unit 666
1146	;;
1147
1148irframe*)
1149	unit=${i#irframe}
1150	mkdev irframe$unit c %irframe_chr% $unit
1151	;;
1152
1153fcom*)
1154	unit=${i#fcom}
1155	mkdev fcom$unit c %fcom_chr% $unit "" "" $u_uucp
1156	;;
1157
1158openfirm)
1159	mkdev openfirm c %openfirm_chr% 0 444
1160	;;
1161
1162nvram)
1163	mkdev nvram c %nvram_chr% 0 644
1164	;;
1165
1166rtc)
1167	mkdev rtc c %rtc_chr% 0 644
1168	;;
1169
1170clockctl)
1171	mkdev clockctl c %clockctl_chr% 0 660 $g_ntpd
1172	;;
1173
1174nsmb)
1175	makedev nsmb0 nsmb1 nsmb2 nsmb3
1176	;;
1177
1178nsmb*)
1179	unit=${i#nsmb}
1180	mkdev nsmb$unit c %nsmb_chr% $unit 644
1181	;;
1182
1183systrace)
1184	mkdev systrace c %systrace_chr% 0 644
1185	;;
1186
1187kttcp)
1188	mkdev kttcp c %kttcp_chr% 0
1189	;;
1190
1191dmoverio)
1192	mkdev dmoverio c %dmoverio_chr% 0 644
1193	;;
1194
1195veriexec)
1196	mkdev veriexec c %veriexec_chr% 0 600
1197	;;
1198
1199ttyv*)
1200	unit=${i#ttyv}
1201	mkdev ttyv$unit c %pc_chr% $unit
1202	;;
1203
1204# arm, acorn32
1205ttyv*)
1206	unit=${i#ttyv}
1207	mkdev ttyv$unit c %physcon_chr% $unit
1208	;;
1209
1210arcpp*)
1211	unit=${i#arcpp}
1212	mkdev arcpp$unit c %arcpp_chr% $unit
1213	;;
1214
1215par*)
1216	unit=${i#par}
1217	case $unit in
1218	0)
1219		mkdev par$unit c %par_chr% $unit
1220		;;
1221	*)
1222		warn "bad unit for par in: $i"
1223		;;
1224	esac
1225	;;
1226
1227ite*|ttye*)
1228	case $i in
1229	ite*)	unit=${i#ite};;
1230	ttye*)	unit=${i#ttye};;
1231	esac
1232	mkdev ttye$unit	c %ite_chr% $unit
1233	;;
1234
1235pms*)
1236	unit=${i#pms}
1237	mkdev pms$unit c %opms_chr% $unit
1238	;;
1239
1240qms*)
1241	unit=${i#qms}
1242	mkdev qms$unit c %qms_chr% $unit
1243	;;
1244
1245lms*)
1246	unit=${i#lms}
1247	mkdev lms$unit c %lms_chr% $unit
1248	;;
1249
1250mms*)
1251	unit=${i#mms}
1252	mkdev mms$unit c %mms_chr% $unit
1253	;;
1254
1255mouse-*)
1256	case $i in
1257	mouse-pms*) name=pms ;;
1258	mouse-qms*) name=qms ;;
1259	esac
1260	unit=${i#mouse-${name}}
1261	lndev $name$unit mouse
1262	;;
1263
1264kbd)
1265	mkdev kbd c %kbd_chr% 0
1266	;;
1267
1268kbdctl)
1269	mkdev kbdctl c %kbd_chr% 1
1270	;;
1271
1272vidcconsole0)
1273	mkdev vidcconsole0 c %vidcconsole_chr% 0 640
1274	;;
1275
1276view*)
1277	unit=${i#view}
1278	mkdev view$unit	c %view_chr% $unit 666
1279	;;
1280
1281mouse*)
1282	unit=${i#mouse}
1283	case $unit in
1284	0|1)
1285		mkdev mouse$unit c %ms_chr% $unit 666
1286		if [ $unit = 0 ]; then
1287			lndev mouse$unit mouse
1288		fi
1289		;;
1290	*)
1291		warn "bad unit for mouse in: $i"
1292		;;
1293	esac
1294	;;
1295
1296panel)
1297	mkdev panel0 c %panel_chr% 0 660
1298	;;
1299
1300tslcd)
1301	mkdev tslcd0 c %tslcd_chr% 0 660
1302	;;
1303
1304ipty)
1305	mkdev ttyp0 c %pts_chr% 0 666
1306	mkdev ttyp1 c %pts_chr% 1 666
1307	mkdev ptyp0 c %ptc_chr% 0 666
1308	mkdev ptyp1 c %ptc_chr% 1 666
1309	;;
1310
1311ptm)
1312	mkdev ptmx c %ptm_chr% 0 666
1313	mkdev ptm c %ptm_chr% 1 666
1314	;;
1315
1316grf*)
1317	unit=${i#grf}
1318	mkdev grf$unit c %grf_chr% $unit 666
1319	;;
1320
1321etvme)
1322	mkdev etvme c %et_chr% 0
1323	;;
1324
1325leo*)
1326	unit=${i#leo}
1327	mkdev leo$unit c %leo_chr% $unit
1328	;;
1329
1330scif*)
1331	unit=${i#scif}
1332	mkdev scif$unit c %scif_chr% $unit "" "" $u_uucp
1333	;;
1334
1335sci*)
1336	unit=${i#sci}
1337	mkdev sci$unit c %sci_chr% $unit "" "" $u_uucp
1338	;;
1339
1340maple*)
1341	case $i in
1342	mapleA*) name="mapleA"; unit=0;;
1343	mapleB*) name="mapleB"; unit=1;;
1344	mapleC*) name="mapleC"; unit=2;;
1345	mapleD*) name="mapleD"; unit=3;;
1346	esac
1347	subunit=${i#$name}
1348	mkdev $name$subunit c %maple_chr% $(($unit * 8 + 0$subunit))
1349	;;
1350
1351mmem*)
1352	unit=${i#mmem}
1353	for pt in 0	# 1 2 3 4 ... 255
1354	do
1355#		mkdev mmem${unit}.${pt}a  b %mmem_blk% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator
1356		mkdev mmem${unit}.${pt}c  b %mmem_blk% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator
1357#		mkdev rmmem${unit}.${pt}a c %mmem_chr% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator
1358		mkdev rmmem${unit}.${pt}c c %mmem_chr% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator
1359	done
1360	;;
1361
1362mlcd*)
1363	unit=${i#mlcd}
1364	for pt in 0	# 1 2 3 4 ... 255
1365	do
1366		mkdev mlcd${unit}.${pt} c %mlcd_chr% $(($unit * 256 + $pt)) 640 $g_operator
1367	done
1368	;;
1369
1370ixpcom*)
1371	unit=${i#ixpcom}
1372	mkdev ixpcom$unit c %ixpcom_chr% $unit "" "" $u_uucp
1373	;;
1374
1375epcom*)
1376	unit=${i#epcom}
1377	mkdev epcom$unit c %epcom_chr% $unit "" "" $u_uucp
1378	;;
1379
1380ucbsnd)
1381	mkdev ucbsnd c %ucbsnd_chr% 0 666
1382	;;
1383
1384adb)
1385	mkdev adb c %aed_chr% 0 666
1386	;;
1387
1388asc*)
1389	unit=${i#asc}
1390	mkdev asc$unit c %asc_chr% $unit 666
1391	;;
1392
1393bwtwo*)
1394	unit=${i#bwtwo}
1395	mkdev bwtwo$unit c %bwtwo_chr% $unit 666
1396	;;
1397
1398cgtwo*)
1399	unit=${i#cgtwo}
1400	mkdev cgtwo$unit c %cgtwo_chr% $unit 666
1401	;;
1402
1403cgthree*)
1404	unit=${i#cgthree}
1405	mkdev cgthree$unit c %cgthree_chr% $unit 666
1406	;;
1407
1408cgfour*)
1409	unit=${i#cgfour}
1410	mkdev cgfour$unit c %cgfour_chr% $unit 666
1411	;;
1412
1413cgsix*)
1414	unit=${i#cgsix}
1415	mkdev cgsix$unit c %cgsix_chr% $unit 666
1416	;;
1417
1418cgeight*)
1419	unit=${i#cgeight}
1420	mkdev cgeight$unit c %cgeight_chr% $unit 666
1421	;;
1422
1423tcx*)
1424	unit=${i#tcx}
1425	mkdev tcx$unit c %tcx_chr% $unit 666
1426	;;
1427
1428xd*|xy*)
1429	case $i in
1430	xd*)	name=xd; unit=${i#xd}; blk=%xd_blk%;	chr=%xd_chr%;;
1431	xy*)	name=xy; unit=${i#xy}; blk=%xy_blk%;	chr=%xy_chr%;;
1432	esac
1433	%MKDISK% $name $unit $blk $chr
1434	;;
1435
1436magma*)
1437	unit=${i#magma}
1438	if [ 0$unit -gt 3 ]; then
1439		warn "bad unit for $i: $unit"
1440		break
1441	fi
1442	for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f
1443	do
1444		case $j in
1445		[0-9])	jn=$j ;;
1446		a)	jn=10 ;;
1447		b)	jn=11 ;;
1448		c)	jn=12 ;;
1449		d)	jn=13 ;;
1450		e)	jn=14 ;;
1451		f)	jn=15 ;;
1452		esac
1453		mkdev tty$unit$j c %mtty_chr% $(($unit * 64 + $jn))
1454	done
1455	mkdev bpp${unit}0 c %mbpp_chr% $(($unit * 64 + 0))
1456	mkdev bpp${unit}1 c %mbpp_chr% $(($unit * 64 + 1))
1457	;;
1458
1459clcd*)
1460	unit=${i#clcd}
1461	if [ 0$unit -gt 7 ]; then
1462		warn "bad unit for $i: $unit"
1463		break
1464	fi
1465	for j in 0 1 2 3 4 5 6 7
1466	do
1467		mkdev ttyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialin)) "" "" $u_uucp
1468		mkdev dtyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialout)) "" "" $u_uucp
1469	done
1470	;;
1471
1472spif*)
1473	unit=${i#spif}
1474	if [ 0$unit -gt 3 ]; then
1475		warn "bad unit for $i: $unit"
1476		break
1477	fi
1478	for j in 0 1 2 3 4 5 6 7; do
1479		mkdev ttyS$unit$j c 102 $(($unit * 64 + $j)) "" "" $u_uucp
1480	done
1481	mkdev bppS${unit}0 c 103 $(($unit * 64 + 0))
1482	mkdev bppS${unit}1 c 103 $(($unit * 64 + 1))
1483	;;
1484
1485bpp*)
1486	unit=${i#bpp}
1487	mkdev bpp$unit c %bpp_chr% $(($unit + 0))
1488	;;
1489
1490tctrl*)
1491	unit=${i#tctrl}
1492	mkdev tctrl$unit c %tctrl_chr% $unit 666
1493	;;
1494
1495bmd*)
1496	unit=${i#bmd}
1497	mkdev bmd${unit}a  b %bmd_blk% $(($unit * 8 + 0)) 640 $g_operator
1498	mkdev bmd${unit}c  b %bmd_blk% $(($unit * 8 + 2)) 640 $g_operator
1499	mkdev rbmd${unit}a c %bmd_chr% $(($unit * 8 + 0)) 640 $g_operator
1500	mkdev rbmd${unit}c c %bmd_chr% $(($unit * 8 + 2)) 640 $g_operator
1501	;;
1502
1503sram)
1504	mkdev sram c %sram_chr% 0 644
1505	;;
1506
1507pow*)
1508	unit=${i#pow}
1509	case $unit in
1510	0|1)
1511		mkdev pow${unit} c %pow_chr% ${unit} 644
1512		if [ $unit = 0 ]; then
1513			lndev pow${unit} pow
1514		fi
1515		;;
1516	*)
1517		warn "bad unit for pow in: $i"
1518		;;
1519	esac
1520	;;
1521
1522ttyS*)
1523	unit=${i#ttyS}
1524	mkdev ttyS$unit c %sacom_chr% $(($unit + $dialin )) "" "" $u_uucp
1525	mkdev dtyS$unit c %sacom_chr% $(($unit + $dialout)) "" "" $u_uucp
1526	;;
1527
1528atabus*)
1529	unit=${i#atabus}
1530	mkdev atabus$unit c %atabus_chr% $unit 644
1531	;;
1532
1533drvctl)
1534	mkdev drvctl c %drvctl_chr% 0 644
1535	;;
1536
1537tap*)
1538	unit=${i#tap}
1539	case "$unit" in
1540	[0-9]*)
1541		mkdev tap${unit} c %tap_chr% ${unit} 600
1542		;;
1543	*)
1544		mkdev tap c %tap_chr% 0xfffff 600
1545		;;
1546	esac
1547	;;
1548
1549fw*)
1550	unit=${i#fw}
1551	for j in 0 1 2 3
1552	do
1553		mkdev fw${unit}.${j} c %fw_chr% $((${unit} * 256 + ${j})) 660 ${g_operator}
1554		mkdev fwmem${unit}.${j} c %fw_chr% $((65536 + ${unit} * 256 + ${j})) 660 ${g_operator}
1555	done
1556	;;
1557
1558midevend)
1559%MI_DEVICES_END%
1560local)
1561	if [ -f "$0.local" ]; then
1562		umask 0
1563		sh $0.local all
1564		umask 077
1565	fi
1566	;;
1567
1568*)
1569	warn "$i: unknown device"
1570	;;
1571
1572esac
1573done
1574
1575}
1576
1577
1578# three variants of disk partitions - max 8, max 16, max 16 with highpartoffset
1579# hack; only the one used by port is retained in final MAKEDEV script
1580# routine is called as:
1581# makedisk name unit blk chr
1582makedisk_p8()
1583{
1584	name="$1"; unit="$2"; blk="$3"; chr="$4"
1585
1586	mkdev ${name}${unit}a	b $blk $(($unit * 8 + 0))	640 $g_operator
1587	mkdev ${name}${unit}b	b $blk $(($unit * 8 + 1))	640 $g_operator
1588	mkdev ${name}${unit}c	b $blk $(($unit * 8 + 2))	640 $g_operator
1589	mkdev ${name}${unit}d	b $blk $(($unit * 8 + 3))	640 $g_operator
1590	mkdev ${name}${unit}e	b $blk $(($unit * 8 + 4))	640 $g_operator
1591	mkdev ${name}${unit}f	b $blk $(($unit * 8 + 5))	640 $g_operator
1592	mkdev ${name}${unit}g	b $blk $(($unit * 8 + 6))	640 $g_operator
1593	mkdev ${name}${unit}h	b $blk $(($unit * 8 + 7))	640 $g_operator
1594	mkdev r${name}${unit}a	c $chr $(($unit * 8 + 0))	640 $g_operator
1595	mkdev r${name}${unit}b	c $chr $(($unit * 8 + 1))	640 $g_operator
1596	mkdev r${name}${unit}c	c $chr $(($unit * 8 + 2))	640 $g_operator
1597	mkdev r${name}${unit}d	c $chr $(($unit * 8 + 3))	640 $g_operator
1598	mkdev r${name}${unit}e	c $chr $(($unit * 8 + 4))	640 $g_operator
1599	mkdev r${name}${unit}f	c $chr $(($unit * 8 + 5))	640 $g_operator
1600	mkdev r${name}${unit}g	c $chr $(($unit * 8 + 6))	640 $g_operator
1601	mkdev r${name}${unit}h	c $chr $(($unit * 8 + 7))	640 $g_operator
1602}
1603
1604makedisk_p16()
1605{
1606	name="$1"; unit="$2"; blk="$3"; chr="$4"
1607
1608	mkdev ${name}${unit}a	b $blk $(($unit * 16 + 0))	640 $g_operator
1609	mkdev ${name}${unit}b	b $blk $(($unit * 16 + 1))	640 $g_operator
1610	mkdev ${name}${unit}c	b $blk $(($unit * 16 + 2))	640 $g_operator
1611	mkdev ${name}${unit}d	b $blk $(($unit * 16 + 3))	640 $g_operator
1612	mkdev ${name}${unit}e	b $blk $(($unit * 16 + 4))	640 $g_operator
1613	mkdev ${name}${unit}f	b $blk $(($unit * 16 + 5))	640 $g_operator
1614	mkdev ${name}${unit}g	b $blk $(($unit * 16 + 6))	640 $g_operator
1615	mkdev ${name}${unit}h	b $blk $(($unit * 16 + 7))	640 $g_operator
1616	mkdev ${name}${unit}i	b $blk $(($unit * 16 + 8))	640 $g_operator
1617	mkdev ${name}${unit}j	b $blk $(($unit * 16 + 9))	640 $g_operator
1618	mkdev ${name}${unit}k	b $blk $(($unit * 16 + 10))	640 $g_operator
1619	mkdev ${name}${unit}l	b $blk $(($unit * 16 + 11))	640 $g_operator
1620	mkdev ${name}${unit}m	b $blk $(($unit * 16 + 12))	640 $g_operator
1621	mkdev ${name}${unit}n	b $blk $(($unit * 16 + 13))	640 $g_operator
1622	mkdev ${name}${unit}o	b $blk $(($unit * 16 + 14))	640 $g_operator
1623	mkdev ${name}${unit}p	b $blk $(($unit * 16 + 15))	640 $g_operator
1624	mkdev r${name}${unit}a	c $chr $(($unit * 16 + 0))	640 $g_operator
1625	mkdev r${name}${unit}b	c $chr $(($unit * 16 + 1))	640 $g_operator
1626	mkdev r${name}${unit}c	c $chr $(($unit * 16 + 2))	640 $g_operator
1627	mkdev r${name}${unit}d	c $chr $(($unit * 16 + 3))	640 $g_operator
1628	mkdev r${name}${unit}e	c $chr $(($unit * 16 + 4))	640 $g_operator
1629	mkdev r${name}${unit}f	c $chr $(($unit * 16 + 5))	640 $g_operator
1630	mkdev r${name}${unit}g	c $chr $(($unit * 16 + 6))	640 $g_operator
1631	mkdev r${name}${unit}h	c $chr $(($unit * 16 + 7))	640 $g_operator
1632	mkdev r${name}${unit}i	c $chr $(($unit * 16 + 8))	640 $g_operator
1633	mkdev r${name}${unit}j	c $chr $(($unit * 16 + 9))	640 $g_operator
1634	mkdev r${name}${unit}k	c $chr $(($unit * 16 + 10))	640 $g_operator
1635	mkdev r${name}${unit}l	c $chr $(($unit * 16 + 11))	640 $g_operator
1636	mkdev r${name}${unit}m	c $chr $(($unit * 16 + 12))	640 $g_operator
1637	mkdev r${name}${unit}n	c $chr $(($unit * 16 + 13))	640 $g_operator
1638	mkdev r${name}${unit}o	c $chr $(($unit * 16 + 14))	640 $g_operator
1639	mkdev r${name}${unit}p	c $chr $(($unit * 16 + 15))	640 $g_operator
1640}
1641
1642makedisk_p16high()
1643{
1644	ho=524280	# offset for partition 9 to 16
1645	name="$1"; unit="$2"; blk="$3"; chr="$4"
1646
1647	mkdev ${name}${unit}a	b $blk $(($unit * 8 + 0))	640 $g_operator
1648	mkdev ${name}${unit}b	b $blk $(($unit * 8 + 1))	640 $g_operator
1649	mkdev ${name}${unit}c	b $blk $(($unit * 8 + 2))	640 $g_operator
1650	mkdev ${name}${unit}d	b $blk $(($unit * 8 + 3))	640 $g_operator
1651	mkdev ${name}${unit}e	b $blk $(($unit * 8 + 4))	640 $g_operator
1652	mkdev ${name}${unit}f	b $blk $(($unit * 8 + 5))	640 $g_operator
1653	mkdev ${name}${unit}g	b $blk $(($unit * 8 + 6))	640 $g_operator
1654	mkdev ${name}${unit}h	b $blk $(($unit * 8 + 7))	640 $g_operator
1655	mkdev ${name}${unit}i	b $blk $(($unit * 8 + $ho + 8))	640 $g_operator
1656	mkdev ${name}${unit}j	b $blk $(($unit * 8 + $ho + 9))	640 $g_operator
1657	mkdev ${name}${unit}k	b $blk $(($unit * 8 + $ho + 10)) 640 $g_operator
1658	mkdev ${name}${unit}l	b $blk $(($unit * 8 + $ho + 11)) 640 $g_operator
1659	mkdev ${name}${unit}m	b $blk $(($unit * 8 + $ho + 12)) 640 $g_operator
1660	mkdev ${name}${unit}n	b $blk $(($unit * 8 + $ho + 13)) 640 $g_operator
1661	mkdev ${name}${unit}o	b $blk $(($unit * 8 + $ho + 14)) 640 $g_operator
1662	mkdev ${name}${unit}p	b $blk $(($unit * 8 + $ho + 15)) 640 $g_operator
1663	mkdev r${name}${unit}a	c $chr $(($unit * 8 + 0))	640 $g_operator
1664	mkdev r${name}${unit}b	c $chr $(($unit * 8 + 1))	640 $g_operator
1665	mkdev r${name}${unit}c	c $chr $(($unit * 8 + 2))	640 $g_operator
1666	mkdev r${name}${unit}d	c $chr $(($unit * 8 + 3))	640 $g_operator
1667	mkdev r${name}${unit}e	c $chr $(($unit * 8 + 4))	640 $g_operator
1668	mkdev r${name}${unit}f	c $chr $(($unit * 8 + 5))	640 $g_operator
1669	mkdev r${name}${unit}g	c $chr $(($unit * 8 + 6))	640 $g_operator
1670	mkdev r${name}${unit}h	c $chr $(($unit * 8 + 7))	640 $g_operator
1671	mkdev r${name}${unit}i	c $chr $(($unit * 8 + $ho + 8))	640 $g_operator
1672	mkdev r${name}${unit}j	c $chr $(($unit * 8 + $ho + 9))	640 $g_operator
1673	mkdev r${name}${unit}k	c $chr $(($unit * 8 + $ho + 10)) 640 $g_operator
1674	mkdev r${name}${unit}l	c $chr $(($unit * 8 + $ho + 11)) 640 $g_operator
1675	mkdev r${name}${unit}m	c $chr $(($unit * 8 + $ho + 12)) 640 $g_operator
1676	mkdev r${name}${unit}n	c $chr $(($unit * 8 + $ho + 13)) 640 $g_operator
1677	mkdev r${name}${unit}o	c $chr $(($unit * 8 + $ho + 14)) 640 $g_operator
1678	mkdev r${name}${unit}p	c $chr $(($unit * 8 + $ho + 15)) 640 $g_operator
1679}
1680
1681# make only the very few basic disk device nodes - 'a' partition
1682# and raw partition
1683makedisk_minimal()
1684{
1685	name=$1; unit=$2; blk=$3; chr=$4
1686	doff=%DISKMINOROFFSET%
1687	ro=%RAWDISK_OFF%
1688	rn=%RAWDISK_NAME%
1689
1690	mkdev ${name}${unit}a	b $blk $(($unit * $doff + 0))	640 $g_operator
1691	mkdev ${name}${unit}$rn	b $blk $(($unit * $doff + $ro))	640 $g_operator
1692	mkdev r${name}${unit}a	c $chr $(($unit * $doff + 0))	640 $g_operator
1693	mkdev r${name}${unit}$rn c $chr $(($unit * $doff + $ro)) 640 $g_operator
1694}
1695
1696makedev $*
1697