MAKEDEV.tmpl revision 1.63
1#!/bin/sh -
2#	$NetBSD: MAKEDEV.tmpl,v 1.63 2006/09/23 20:23:09 elad 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#	amr*	AMI MegaRaid control device
227#	apm	power management device
228#	audio*	audio devices
229#	bell*	OPM bell device (x68k)
230#	bktr	Brooktree 848/849/878/879 based TV cards
231#	bpf	packet filter
232#	bthub	Bluetooth Device Hub control interface
233#	cfs*	Coda file system device
234#	ch*	SCSI media changer
235#	cir*	Consumer IR
236#	clockctl clock control for non root users
237#	crypto	hardware crypto access driver
238#	dmoverio hardware-assisted data movers
239#	dpt*	DPT/Adaptec EATA RAID management interface
240#	dpti*	DPT/Adaptec I2O RAID management interface
241#	fb*	PMAX generic framebuffer pseudo-device
242#	fd	file descriptors
243#	grf*	graphics frame buffer device
244#	hil	HP300 HIL input devices
245#	icp	ICP-Vortex/Intel RAID control interface
246#	iic*	IIC bus device
247#	iop*	I2O IOP control interface
248#	ipl	IP Filter
249#	irframe* IrDA physical frame
250#	ite*	terminal emulator interface to HP300 graphics devices
251#	joy*	joystick device
252#	kttcp	kernel ttcp helper device
253#	lkm	loadable kernel modules interface
254#	lockstat kernel locking statistics
255#	magma*	Magma multiport serial/parallel cards
256#	midi*	MIDI
257#	mlx*	Mylex DAC960 control interface
258#	mly*	Mylex AcceleRAID/eXtremeRAID control interface
259#	np*	UNIBUS Ethernet co-processor interface, for downloading.
260#	nsmb*	SMB requester
261#	openfirm OpenFirmware accessor
262#	pci*	PCI bus access devices
263#	pf	PF packet filter
264#	pow*	power management device (x68k)
265#	px*	PixelStamp Xserver access
266#	radio*	radio devices
267#	random	Random number generator
268#	rtc*	RealTimeClock
269#	satlink* PlanetConnect satellite receiver driver
270#	scsibus* SCSI busses
271#	se*	SCSI Ethernet
272#	ses*	SES/SAF-TE SCSI Devices
273#	speaker	PC speaker		(XXX - installed)
274#	sram	battery backuped memory (x68k)
275#	ss*	SCSI scanner
276#	stic*	PixelStamp interface chip
277#	sysmon	System Monitoring hardware
278#	systrace syscall tracer
279#	tap*	virtual Ethernet device
280#	tun*	network tunnel driver
281#	twe	3ware Escalade control interface
282#	uk*	unknown SCSI device
283#	veriexec verified executable fingerprint loader
284#	vmegen*	generic VME access
285#	view*	generic interface to graphic displays (Amiga)
286#	wsfont*	console font control
287#	wsmux*	wscons event multiplexor
288#	xenevt	Xen event interface
289
290
291PATH=/sbin:/usr/sbin:/bin:/usr/bin:/rescue
292
293
294usage()
295{
296	cat 1>&2 << _USAGE_
297Usage: ${0##*/} [-f] [-m mknod] [-s]  special [...]
298	Create listed special devices.  Options:
299	-f		Force permissions to be updated on existing devices.
300	-m mknod	Name of mknod(8) program.  [\$TOOL_MKNOD or mknod]
301	-s		Generate mtree(8) specfile instead of creating devices.
302
303_USAGE_
304	exit 1
305}
306
307# zeropad width number
308#	display number with a zero (`0') padding of width digits.
309#
310zeropad()
311{
312	case $(($1 - ${#2})) in
313	5)	echo 00000$2;;
314	4)	echo 0000$2;;
315	3)	echo 000$2;;
316	2)	echo 00$2;;
317	1)	echo 0$2;;
318	0)	echo $2;;
319	*)	echo "$0: bad padding" 1>&2; exit 1;;
320	esac
321}
322
323# hexprint number
324#	display (base10) number as hexadecimal
325#
326hexprint()
327{
328	case $1 in
329	[0-9])	echo $1 ;;
330	10)	echo a ;;
331	11)	echo b ;;
332	12)	echo c ;;
333	13)	echo d ;;
334	14)	echo e ;;
335	15)	echo f ;;
336	*)	echo $(hexprint $(($1 / 16)))$(hexprint $(($1 % 16))) ;;
337	esac
338}
339
340do_force=false
341do_specfile=false
342while getopts fm:s ch; do
343	case ${ch} in
344	f)	do_force=true ;;
345	m)	TOOL_MKNOD=${OPTARG} ;;
346	s)	do_specfile=true ;;
347	*)	usage ;;
348	esac
349done
350shift $((${OPTIND} - 1))
351[ $# -gt 0 ] || usage
352
353
354MKNOD="${TOOL_MKNOD:-mknod} -F netbsd"
355if $do_force; then
356	MKNOD="${MKNOD} -R"
357else
358	MKNOD="${MKNOD} -r"
359fi
360
361u_root="%uid_root%"
362u_uucp="%uid_uucp%"
363g_kmem="%gid_kmem%"
364g_ntpd="%gid_ntpd%"
365g_operator="%gid_operator%"
366g_wheel="%gid_wheel%"
367dialin=0
368dialout=524288
369callunit=262144
370
371# only allow read&write for owner by default
372umask 077
373
374# Check if we have fdesc mounted
375if [ -d fd ]; then
376        case "$(df fd)" in
377        *fdesc*)	nofdesc=false;;
378        *)		nofdesc=true;;
379        esac
380else
381        nofdesc=true
382fi
383
384
385if $do_specfile; then
386	echo ". type=dir"
387fi
388
389
390#
391# functions available to create nodes:
392#
393# mkdev name [b|c] major minor [mode{=600} [gid{=0} [uid{=0}]]]
394#	create device node `name' with the appropriate permissions
395#
396# lndev src target
397#	create a symlink from src to target
398#
399# makedir dir mode
400#	create directory with appropriate mode
401#
402
403mkdev()
404{
405	if $do_specfile; then
406		case $2 in
407		b)	type=block ;;
408		c)	type=char ;;
409		esac
410		echo "./$1 type=${type} device=netbsd,$3,$4 mode=${5:-600} gid=${6:-$g_wheel} uid=${7:-$u_root}"
411	else
412		${MKNOD} -m ${5:-600} -g \#${6:-$g_wheel} -u \#${7:-$u_root} $1 $2 $3 $4
413	fi
414}
415
416lndev()
417{
418	if $do_specfile; then
419		echo "./$2 type=link link=$1 mode=0700 gid=$g_wheel uid=$u_root"
420	else
421		ln -f -s $1 $2
422	fi
423}
424
425makedir()
426{
427	if $do_specfile; then
428		echo "./$1 type=dir mode=$2 gid=$g_wheel uid=$u_root"
429	else
430		mkdir $1 2>/dev/null
431		chmod $2 $1
432	fi
433}
434
435warn()
436{
437	echo 1>&2 "$0: $*"
438}
439
440
441
442# makedev special [...]
443#	the main loop
444#
445
446makedev()
447{
448
449for i
450do
451
452case $i in
453
454%MD_DEVICES%
455
456all)
457	makedev all_md
458	makedev std fd ptm pty0 pty1 pty2 pty3
459	makedev ccd0 ccd1 ccd2 ccd3
460	makedev cgd0 cgd1 cgd2 cgd3
461	makedev fss0 fss1 fss2 fss3
462	makedev md0 md1
463	makedev raid0 raid1 raid2 raid3 raid4 raid5 raid6 raid7
464	makedev ses0 ses1 ses2 ses3
465	makedev vnd0 vnd1 vnd2 vnd3
466	makedev bpf
467	makedev tun0 tun1 tun2 tun3
468	makedev ipl pf crypto random systrace
469	makedev lkm lockstat clockctl
470	makedev local
471	makedev atabus0 atabus1 atabus2 atabus3
472	makedev tap tap0 tap1 tap2 tap3
473	makedev gpio gpio0 gpio1 gpio2 gpio3 gpio4 gpio5 gpio6 gpio7
474	makedev bthub
475	;;
476
477init)
478	# unless overridden by MD entry, this is equal to 'all'
479	makedev all
480	;;
481
482%MI_DEVICES_BEGIN%
483audio)
484	makedev audio0 audio1 audio2 audio3
485	lndev sound0 sound
486	lndev audio0 audio
487	lndev mixer0 mixer
488	lndev audioctl0 audioctl
489	;;
490
491gpio)
492	makedev gpio0 gpio1 gpio2 gpio3 gpio4 gpio5 gpio6 gpio7
493	lndev gpio0 gpio
494	;;
495
496radio)
497	makedev radio0 radio1
498	lndev radio0 radio
499	;;
500
501ramdisk)
502	makedev floppy md0
503	;;
504
505usbs)
506	makedev usb usb0 usb1 usb2 usb3 usb4 usb5 usb6 usb7
507	makedev uhid0 uhid1 uhid2 uhid3
508	makedev ulpt0 ulpt1
509	makedev ttyU0 ttyU1
510	makedev ttyY0 ttyY1
511	makedev urio0
512	makedev uscanner0 uscanner1
513	makedev utoppy0 utoppy1
514	makedev ugen0
515	;;
516
517isdns)
518	makedev isdn isdnctl isdnbchan0 isdnbchan1 isdntel0 isdntel1 isdnteld0 isdnteld1 isdntrc0 isdntrc1
519	;;
520
521std)
522	mkdev		console	c %cons_chr% 0	600
523	mkdev		constty	c %cons_chr% 1	600
524	mkdev		drum	c %swap_chr% 0	640 $g_kmem
525	mkdev		kmem	c %mem_chr% 1	640 $g_kmem
526	mkdev		mem	c %mem_chr% 0	640 $g_kmem
527	mkdev		null	c %mem_chr% 2	666
528	mkdev		zero	c %mem_chr% 12	666
529	mkdev		klog	c %log_chr% 0	600
530	mkdev		ksyms	c %ksyms_chr% 0	444
531	if $nofdesc; then
532		mkdev	tty	c %ctty_chr% 0		666
533		mkdev	stdin	c %filedesc_chr% 0	666
534		mkdev	stdout	c %filedesc_chr% 1	666
535		mkdev	stderr	c %filedesc_chr% 2	666
536	fi
537	;;
538
539usb)
540	mkdev usb c %usb_chr% 255 444
541	;;
542
543usb*)
544	unit=${i#usb}
545	usb=usb$unit
546	mkdev usb$unit c %usb_chr% $unit
547	;;
548
549uhid*)
550	unit=${i#uhid}
551	mkdev uhid$unit c %uhid_chr% $unit 666
552	;;
553
554ulpt*)
555	unit=${i#ulpt}
556	mkdev ulpt$unit c %ulpt_chr% $unit
557	mkdev ulpn$unit c %ulpt_chr% $(($unit + 64))
558	;;
559
560urio*)
561	unit=${i#urio}
562	mkdev urio$unit c %urio_chr% $unit 666
563	;;
564
565uscanner*)
566	unit=${i#uscanner}
567	mkdev uscanner$unit c %uscanner_chr% $unit
568	;;
569
570utoppy*)
571	unit=${i#utoppy}
572	mkdev utoppy$unit c %utoppy_chr% $unit
573	;;
574
575ttyY*)
576	unit=${i#ttyY}
577	mkdev ttyY$unit c %ucycom_chr% $(($unit + $dialin  )) "" "" $u_uucp
578	mkdev dtyY$unit c %ucycom_chr% $(($unit + $dialout )) "" "" $u_uucp
579	mkdev ctyY$unit c %ucycom_chr% $(($unit + $callunit)) "" "" $u_uucp
580	;;
581
582ttyU*)
583	unit=${i#ttyU}
584	mkdev ttyU$unit c %ucom_chr% $(($unit + $dialin  )) "" "" $u_uucp
585	mkdev dtyU$unit c %ucom_chr% $(($unit + $dialout )) "" "" $u_uucp
586	mkdev ctyU$unit c %ucom_chr% $(($unit + $callunit)) "" "" $u_uucp
587	;;
588
589ugen*)
590	unit=${i#ugen}
591	for j in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
592	do
593		mkdev ugen$unit.$j c %ugen_chr% $(($unit * 16 + ${j#0}))
594	done
595	;;
596
597wscons)
598	makedev ttyE0 ttyE1 ttyE2 ttyE3 ttyE4 ttyE5 ttyE6 ttyE7
599	makedev wsmouse0 wsmouse1 wsmouse2 wsmouse3
600	makedev wskbd0 wskbd1 wskbd2 wskbd3
601	makedev wsmux0 wsmux1 wsmux2 wsmux3
602	makedev wsmouse wskbd
603	makedev ttyEcfg ttyEstat
604	makedev wsfont
605	;;
606
607wsmouse)
608	mkdev wsmouse c %wsmux_chr% 0
609	;;
610
611wskbd)
612	mkdev wskbd c %wsmux_chr% 1
613	;;
614
615wsmux*)
616	unit=${i#wsmux}
617	mkdev wsmux$unit    c %wsmux_chr% $unit
618	mkdev wsmuxctl$unit c %wsmux_chr% $(($unit + 128)) 200
619	;;
620
621xenevt)
622	mkdev xenevt c %xenevt_chr% 0
623	;;
624
625xsd_kva)
626	mkdev xsd_kva c %xenevt_chr% 1
627	;;
628
629xencons)
630	mkdev xencons c %xencons_chr% 0
631	;;
632
633ttyEstat)
634	mkdev ttyEstat c %wsdisplay_chr% 254
635	;;
636
637ttyEcfg)
638	mkdev ttyEcfg c %wsdisplay_chr% 255
639	;;
640
641ttyE*)
642	unit=${i#ttyE}
643	mkdev ttyE$unit c %wsdisplay_chr% $unit
644	;;
645
646wsmouse*)
647	unit=${i#wsmouse}
648	mkdev wsmouse$unit c %wsmouse_chr% $unit
649	;;
650
651wskbd*)
652	unit=${i#wskbd}
653	mkdev wskbd$unit c %wskbd_chr% $unit
654	;;
655
656fd)
657	if $nofdesc; then
658		makedir fd 755
659		n=0
660		while [ $n -lt 64 ]
661		do
662			mkdev fd/$n c %filedesc_chr% $n 666
663			n=$(($n + 1))
664		done
665	fi
666	;;
667
668wt*)
669	case $i in
670	wt*) name=wt;  unit=${i#wt};	chr=%wt_chr%;	blk=%wt_blk%;;
671	esac
672	for sub in $unit $(($unit+8)) $(($unit+16))
673	do
674		mkdev $name$sub		b $blk $(($sub + 0)) 660 $g_operator
675		mkdev n$name$sub	b $blk $(($sub + 4)) 660 $g_operator
676		mkdev r$name$sub	c $chr $(($sub + 0)) 660 $g_operator
677		mkdev nr$name$sub	c $chr $(($sub + 4)) 660 $g_operator
678	done
679	;;
680
681md*)
682	makedisk_minimal md ${i#md} %md_blk% %md_chr%
683	;;
684
685fss*)
686	case $i in
687	fss*) name=fss; unit=${i#fss};	blk=%fss_blk%;	chr=%fss_chr%
688	esac
689	mkdev $name$unit	b $blk $unit 660 $g_operator
690	mkdev r$name$unit	c $chr $unit 660 $g_operator
691	;;
692
693ss*)
694	case $i in
695	ss*) name=ss;	unit=${i#ss};	chr=%ss_chr%;;
696	esac
697	mkdev $name$unit	c $chr $(($unit * 16 + 0)) 640 $g_operator
698	mkdev n$name$unit	c $chr $(($unit * 16 + 1)) 640 $g_operator
699	mkdev en$name$unit	c $chr $(($unit * 16 + 3)) 640 $g_operator
700	;;
701
702ccd*|cgd*|raid*|vnd*)
703	case $i in
704	ccd*)	name=ccd;	unit=${i#ccd};	blk=%ccd_blk%;	chr=%ccd_chr%;;
705	cgd*)	name=cgd;	unit=${i#cgd};	blk=%cgd_blk%;	chr=%cgd_chr%;;
706	raid*)	name=raid;	unit=${i#raid}; blk=%raid_blk%; chr=%raid_chr%;;
707	vnd*)	name=vnd;	unit=${i#vnd};	blk=%vnd_blk%;	chr=%vnd_chr%;;
708	esac
709	%MKDISK% $name $unit $blk $chr
710	;;
711
712sd*)
713	name=sd; unit=${i#sd};	blk=%sd_blk%;	chr=%sd_chr%
714	%MKDISK% $name $unit $blk $chr
715	;;
716
717wd*)
718	name=wd; unit=${i#wd}; blk=%wd_blk%; chr=%wd_chr%
719	%MKDISK% $name $unit $blk $chr
720	;;
721
722fd*)
723	name=fd; unit=${i#fd}; blk=%fd_blk%; chr=%fd_chr%
724	%MKDISK% $name $unit $blk $chr
725	;;
726
727ld*)
728	name=ld; unit=${i#ld}; blk=%ld_blk%; chr=%ld_chr%
729	%MKDISK% $name $unit $blk $chr
730	;;
731
732ed*)
733	name=ed; unit=${i#ed}; blk=%ed_blk%; chr=%ed_chr%
734	%MKDISK% $name $unit $blk $chr
735	;;
736
737ofdisk*)
738	name=ofdisk; unit=${i#ofdisk}; blk=%ofdisk_blk%; chr=%ofdisk_chr%
739	%MKDISK% $name $unit $blk $chr
740	;;
741
742xbd*)
743	name=xbd; unit=${i#xbd}; blk=%xbd_blk%; chr=%xbd_chr%
744	%MKDISK% $name $unit $blk $chr
745	;;
746
747dk*)
748	name=dk; unit=${i#dk}; blk=%dk_blk%; chr=%dk_chr%
749	minor=0 
750	while [ $minor -lt ${i#dk} ]
751	do
752		mkdev r$name$minor c $chr $minor 0640 $g_operator
753		mkdev $name$minor b $blk  $minor 0640 $g_operator
754		minor=$(($minor + 1))
755	done
756	;;
757	
758ttyCY*)
759	name=tyCY; chr=%cy_chr%; off=32
760	unit=${i#t${name}}
761	minor=$(($unit * $off))
762	eminor=$(($minor + $off))
763	while [ $minor -lt $eminor ]
764	do
765		# nminor=$(zeropad 3 $minor)
766		nminor=000$minor
767		nminor=${nminor#${nminor%???}}
768		mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp
769		mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp
770		minor=$(($minor + 1))
771	done
772	;;
773
774ttyCZ*)
775	name=tyCZ; chr=%cz_chr%; off=64
776	unit=${i#t${name}}
777	minor=$(($unit * $off))
778	eminor=$(($minor + $off))
779	while [ $minor -lt $eminor ]
780	do
781		# nminor=$(zeropad 4 $minor)
782		nminor=0000$minor
783		nminor=${nminor#${nminor%????}}
784		mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp
785		mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp
786		minor=$(($minor + 1))
787	done
788	;;
789
790
791tty[0-9]|tty0[0-9])
792	# some archs have built-in zstty (major %zstty_chr%) instead
793	# of NS16550; create ttyZ* and hardlink as [dt]ty0*; this
794	# needs to be before com entry, for archs which have both
795	unit=${i#tty}
796	unit=$(($unit + 0))
797	makedev ttyZ${unit}
798	lndev ttyZ$unit tty0${unit}
799	lndev dtyZ$unit dty0${unit}
800	;;
801
802tty0*|tty1*|tty[0-9])
803	unit=${i#tty}
804	# ounit=$(zeropad 2 $unit)
805	ounit=00$unit
806	ounit=${ounit#${ounit%??}}
807	mkdev tty$ounit c %com_chr% $(($unit + $dialin )) "" "" $u_uucp
808	mkdev dty$ounit c %com_chr% $(($unit + $dialout)) "" "" $u_uucp
809	;;
810
811ttyC*)
812		# some archs call com_chr ttyC traditionally
813	unit=${i#ttyC}; name=ttyC; dname=dtyC; chr=%com_chr%
814	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
815	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
816	;;
817
818ttyh*)
819	unit=${i#ttyh}; name=ttyh; dname=dtyh; chr=%sabtty_chr%
820	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
821	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
822	;;
823
824ttyTX*)
825	unit=${i#ttyTX}; name=ttyTX0; dname=dtyTX0; chr=%txcom_chr%
826	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
827	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
828	;;
829
830ttyZ*)
831	unit=${i#ttyZ}; name=ttyZ; dname=dtyZ; chr=%zstty_chr%
832	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
833	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
834	;;
835
836opty)
837	for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f
838	do
839		case $j in
840		[0-9])	jn=$j ;;
841		a)	jn=10 ;;
842		b)	jn=11 ;;
843		c)	jn=12 ;;
844		d)	jn=13 ;;
845		e)	jn=14 ;;
846		f)	jn=15 ;;
847		esac
848		mkdev ttyp$j c %pts_chr% $jn 666
849		mkdev ptyp$j c %ptc_chr% $jn 666
850	done
851	;;
852
853pty*)
854	class=${i#pty}
855	d1="p q r s t u v w x y z P Q R S T"
856	if [ "$class" -ge 64 ]
857	then
858		warn "$i: pty unit must be between 0 and 63"
859		continue
860	elif [ "$class" -lt 16 ]
861	then
862		offset=0
863		mult=0
864		d2="0 1 2 3 4 5 6 7 8 9 a b c d e f"
865	else
866		class=$(($class - 16))
867		offset=256
868		mult=2
869		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"
870	fi
871	start=$(($class * 16))
872	set -- $d2
873	nt=$#
874	s1=$(($start / $nt))
875	set -- $d1
876	shift $s1
877	t1=$1
878	if [ "$t1" = v ]; then
879		warn "$i: pty unit conflicts with console ttyv0 device"
880		continue
881	fi
882	s2=$(($start % ($nt - $s1 * $mult)))
883	set -- $d2
884	shift $s2
885	t2=$1
886	unit=$(($start + $offset - $s1 * $mult))
887	end=$(($unit + 16))
888	while [ "$unit" -lt "$end" ]
889	do
890		mkdev tty$t1$t2 c %pts_chr% $unit 666
891		mkdev pty$t1$t2 c %ptc_chr% $unit 666
892		shift
893		t2=$1
894		if [ -z "$t2" ]
895		then
896			break
897		fi
898		unit=$(($unit + 1))
899	done
900	;;
901
902stic*)
903	unit=${i#stic}
904	mkdev stic$unit c %stic_chr% $unit
905	;;
906
907st*)
908	case $i in
909	st*) name=st;	unit=${i#st};	chr=%st_chr%;	blk=%st_blk%;;
910	esac
911	mkdev $name$unit	b $blk $(($unit * 16 + 0)) 660 $g_operator
912	mkdev n$name$unit	b $blk $(($unit * 16 + 1)) 660 $g_operator
913	mkdev e$name$unit	b $blk $(($unit * 16 + 2)) 660 $g_operator
914	mkdev en$name$unit	b $blk $(($unit * 16 + 3)) 660 $g_operator
915	mkdev r$name$unit	c $chr $(($unit * 16 + 0)) 660 $g_operator
916	mkdev nr$name$unit	c $chr $(($unit * 16 + 1)) 660 $g_operator
917	mkdev er$name$unit	c $chr $(($unit * 16 + 2)) 660 $g_operator
918	mkdev enr$name$unit	c $chr $(($unit * 16 + 3)) 660 $g_operator
919	;;
920
921ses*|ch*|uk*)
922	case $i in
923	ch*)	name=ch;	unit=${i#ch};	chr=%ch_chr%;;
924	uk*)	name=uk;	unit=${i#uk};	chr=%uk_chr%;;
925	ses*)	name=ses;	unit=${i#ses};	chr=%ses_chr%;;
926	esac
927	mkdev $name$unit c $chr $unit 640 $g_operator
928	;;
929
930cd*)
931	makedisk_minimal cd ${i#cd} %cd_blk% %cd_chr% %
932	;;
933
934mcd*)
935	makedisk_minimal mcd ${i#mcd} %mcd_blk% %mcd_chr%
936	;;
937
938gdrom*)
939	makedisk_minimal gdrom ${i#gdrom} %gdrom_blk% %gdrom_chr%
940	;;
941
942lpt*|lpa*)
943	case $i in
944	lpt*) name=lpt;	unit=${i#lpt};	chr=%lpt_chr%;	flags=0;;
945	lpa*) name=lpa;	unit=${i#lpa};	chr=%lpt_chr%;	flags=128;;
946	esac
947	mkdev $name$unit c $chr $(($unit + $flags))
948	mkdev lpt${unit}ctl c $chr $(($unit + 256))
949	;;
950
951bpf)
952	mkdev bpf	c %bpf_chr% 0
953	lndev bpf bpf0
954	;;
955
956bthub)
957	mkdev bthub c %bthub_chr% 0
958	;;
959
960tun*)
961	unit=${i#tun}
962	mkdev tun$unit c %tun_chr% $unit
963	;;
964
965joy*)
966	unit=${i#joy}
967	mkdev joy$unit c %joy_chr% $unit
968	;;
969
970ipl)
971	mkdev ipl	c %ipl_chr% 0
972	mkdev ipnat	c %ipl_chr% 1
973	mkdev ipstate	c %ipl_chr% 2
974	mkdev ipauth	c %ipl_chr% 3
975	mkdev ipsync	c %ipl_chr% 4
976	mkdev ipscan	c %ipl_chr% 5
977	mkdev iplookup	c %ipl_chr% 6
978	;;
979
980pf)
981	mkdev pf c %pf_chr% 0
982	;;
983
984crypto)
985	mkdev crypto c %crypto_chr% 0 666
986	;;
987
988speaker)
989	mkdev speaker c %spkr_chr% 0
990	;;
991
992lkm)
993	mkdev lkm c %lkm_chr% 0 640 $g_kmem
994	;;
995
996lockstat)
997	mkdev lockstat c %lockstat_chr% 0
998	;;
999
1000audio*)
1001	unit=${i#audio}
1002	audio=audio$unit
1003	sound=sound$unit
1004	mixer=mixer$unit
1005	audioctl=audioctl$unit
1006	: ${unit:-0}
1007	mkdev $sound    c %audio_chr% $(($unit + 0))	666
1008	mkdev $audio    c %audio_chr% $(($unit + 128))	666
1009	mkdev $mixer    c %audio_chr% $(($unit + 16))	666
1010	mkdev $audioctl c %audio_chr% $(($unit + 192))	666
1011	;;
1012
1013gpio*)
1014	unit=${i#gpio}
1015	mkdev gpio$unit c %gpio_chr% $unit 644
1016	;;
1017
1018rmidi*)
1019	unit=${i#rmidi}
1020	mkdev rmidi$unit c %midi_chr% $unit 666
1021	;;
1022
1023music*)
1024	unit=${i#music}
1025	: ${unit:-0}
1026	mkdev music$unit     c %sequencer_chr% $(($unit + 0))	666
1027	mkdev sequencer$unit c %sequencer_chr% $(($unit + 128))	666
1028	;;
1029
1030radio*)
1031	unit=${i#radio}
1032	: ${unit:-0}
1033	mkdev radio$unit c %radio_chr% $unit 666
1034	;;
1035
1036amr*)
1037	unit=${i#amr}
1038	mkdev amr$unit c %amr_chr% $unit
1039	;;
1040
1041apm)
1042	mkdev apm	c %apm_chr% 0 644
1043	mkdev apmctl	c %apm_chr% 8 644
1044	;;
1045
1046apm)
1047		# hpcmips uses `apmdev_chr' instead of `apm_chr'
1048	mkdev apm	c %apmdev_chr% 0 644
1049	mkdev apmctl	c %apmdev_chr% 8 644
1050	;;
1051
1052satlink*)
1053	unit=${i#satlink}
1054	mkdev satlink$unit c %satlink_chr% $unit 444
1055	;;
1056
1057random)
1058	mkdev random	c %rnd_chr% 0 444
1059	mkdev urandom	c %rnd_chr% 1 644
1060	;;
1061
1062cfs*)
1063	unit=${i#cfs}
1064	mkdev cfs$unit c %vcoda_chr% $unit
1065	;;
1066
1067sysmon)
1068	mkdev sysmon	c %sysmon_chr% 0 644
1069	mkdev watchdog	c %sysmon_chr% 1 644
1070	mkdev power	c %sysmon_chr% 2 640
1071	;;
1072
1073scsibus*)
1074	unit=${i#scsibus}
1075	mkdev scsibus$unit c %scsibus_chr% $unit 644
1076	;;
1077
1078bktr)
1079	makedev bktr0 bktr1
1080	lndev	bktr0	bktr
1081	lndev	tuner0	tuner
1082	lndev	vbi0	vbi
1083	;;
1084
1085bktr*)
1086	unit=${i#bktr}
1087	mkdev bktr$unit		c %bktr_chr% $(($unit + 0))	444
1088	mkdev tuner$unit	c %bktr_chr% $(($unit + 16))	444
1089	mkdev vbi$unit		c %bktr_chr% $(($unit + 32))	444
1090	;;
1091
1092iop*)
1093	unit=${i#iop}
1094	mkdev iop$unit c %iop_chr% $unit
1095	;;
1096
1097mlx*)
1098	unit=${i#mlx}
1099	mkdev mlx$unit c %mlx_chr% $unit
1100	;;
1101
1102mly*)
1103	unit=${i#mly}
1104	mkdev mly$unit c %mly_chr% $unit
1105	;;
1106
1107twe*)
1108	unit=${i#twe}
1109	mkdev twe$unit c %twe_chr% $unit
1110	;;
1111
1112icp*)
1113	unit=${i#icp}
1114	mkdev icp$unit c %icp_chr% $unit
1115	;;
1116
1117agp*)
1118	unit=${i#agp}
1119	mkdev agp$unit c %agp_chr% $unit 644
1120	if [ "$unit" = "0" ]; then
1121		lndev agp$unit agpgart
1122	fi
1123	;;
1124
1125pci*)
1126	unit=${i#pci}
1127	mkdev pci$unit c %pci_chr% $unit 644
1128	;;
1129
1130dpti*)
1131	unit=${i#dpti}
1132	mkdev dpti$unit c %dpti_chr% $unit
1133	;;
1134
1135dpt*)
1136	unit=${i#dpt}
1137	mkdev dpt$unit c %dpt_chr% $unit
1138	;;
1139
1140altq)
1141	makedir altq 755
1142	unit=0
1143	for dev in altq cbq wfq afm fifoq red rio localq hfsc cdnr blue priq
1144	do
1145		mkdev altq/$dev c %altq_chr% $unit 644
1146		unit=$(($unit + 1))
1147	done
1148	;;
1149
1150isdn)
1151	mkdev isdn c %isdn_chr% 0
1152	;;
1153
1154isdnctl)
1155	mkdev isdnctl c %isdnctl_chr% 0
1156	;;
1157
1158isdnbchan*)
1159	unit=${i#isdnbchan}
1160	mkdev isdnbchan$unit c %isdnbchan_chr% $unit
1161	;;
1162
1163isdnteld*)
1164	unit=${i#isdnteld}
1165	mkdev isdnteld$unit c %isdntel_chr% $(($unit + 64))
1166	;;
1167
1168isdntel*)
1169	unit=${i#isdntel}
1170	mkdev isdntel$unit c %isdntel_chr% $unit
1171	;;
1172
1173isdntrc*)
1174	unit=${i#isdntrc}
1175	mkdev isdntrc$unit c %isdntrc_chr% $unit
1176	;;
1177
1178vmegen)
1179	makedev vmegen0 vmegen1 vmegen2 vmegen3
1180	;;
1181
1182vmegen*)
1183	unit=${i#vmegen}
1184	mkdev vmegen$unit c %vmegeneric_chr% $(($unit * 16 + 0))
1185	;;
1186
1187wsfont)
1188	mkdev wsfont c %wsfont_chr% 0
1189	;;
1190
1191cir*)
1192	unit=${i#cir}
1193	mkdev cir$unit c %cir_chr% $unit 666
1194	;;
1195
1196irframe*)
1197	unit=${i#irframe}
1198	mkdev irframe$unit c %irframe_chr% $unit
1199	;;
1200
1201fcom*)
1202	unit=${i#fcom}
1203	mkdev fcom$unit c %fcom_chr% $unit "" "" $u_uucp
1204	;;
1205
1206openfirm)
1207	mkdev openfirm c %openfirm_chr% 0 444
1208	;;
1209
1210nvram)
1211	mkdev nvram c %nvram_chr% 0 644
1212	;;
1213
1214rtc)
1215	mkdev rtc c %rtc_chr% 0 644
1216	;;
1217
1218clockctl)
1219	mkdev clockctl c %clockctl_chr% 0 660 $g_ntpd
1220	;;
1221
1222nsmb)
1223	makedev nsmb0 nsmb1 nsmb2 nsmb3
1224	;;
1225
1226nsmb*)
1227	unit=${i#nsmb}
1228	mkdev nsmb$unit c %nsmb_chr% $unit 644
1229	;;
1230
1231systrace)
1232	mkdev systrace c %systrace_chr% 0 644
1233	;;
1234
1235kttcp)
1236	mkdev kttcp c %kttcp_chr% 0
1237	;;
1238
1239dmoverio)
1240	mkdev dmoverio c %dmoverio_chr% 0 644
1241	;;
1242
1243veriexec)
1244	mkdev veriexec c %veriexec_chr% 0 600
1245	;;
1246
1247ttyv*)
1248	unit=${i#ttyv}
1249	mkdev ttyv$unit c %pc_chr% $unit
1250	;;
1251
1252# arm, acorn32
1253ttyv*)
1254	unit=${i#ttyv}
1255	mkdev ttyv$unit c %physcon_chr% $unit
1256	;;
1257
1258arcpp*)
1259	unit=${i#arcpp}
1260	mkdev arcpp$unit c %arcpp_chr% $unit
1261	;;
1262
1263par*)
1264	unit=${i#par}
1265	case $unit in
1266	0)
1267		mkdev par$unit c %par_chr% $unit
1268		;;
1269	*)
1270		warn "bad unit for par in: $i"
1271		;;
1272	esac
1273	;;
1274
1275ite*|ttye*)
1276	case $i in
1277	ite*)	unit=${i#ite};;
1278	ttye*)	unit=${i#ttye};;
1279	esac
1280	mkdev ttye$unit	c %ite_chr% $unit
1281	;;
1282
1283pms*)
1284	unit=${i#pms}
1285	mkdev pms$unit c %opms_chr% $unit
1286	;;
1287
1288qms*)
1289	unit=${i#qms}
1290	mkdev qms$unit c %qms_chr% $unit
1291	;;
1292
1293lms*)
1294	unit=${i#lms}
1295	mkdev lms$unit c %lms_chr% $unit
1296	;;
1297
1298mms*)
1299	unit=${i#mms}
1300	mkdev mms$unit c %mms_chr% $unit
1301	;;
1302
1303mouse-*)
1304	case $i in
1305	mouse-pms*) name=pms ;;
1306	mouse-qms*) name=qms ;;
1307	esac
1308	unit=${i#mouse-${name}}
1309	lndev $name$unit mouse
1310	;;
1311
1312kbd)
1313	mkdev kbd c %kbd_chr% 0
1314	;;
1315
1316kbdctl)
1317	mkdev kbdctl c %kbd_chr% 1
1318	;;
1319
1320vidcconsole0)
1321	mkdev vidcconsole0 c %vidcconsole_chr% 0 640
1322	;;
1323
1324view*)
1325	unit=${i#view}
1326	mkdev view$unit	c %view_chr% $unit 666
1327	;;
1328
1329mouse*)
1330	unit=${i#mouse}
1331	case $unit in
1332	0|1)
1333		mkdev mouse$unit c %ms_chr% $unit 666
1334		if [ $unit = 0 ]; then
1335			lndev mouse$unit mouse
1336		fi
1337		;;
1338	*)
1339		warn "bad unit for mouse in: $i"
1340		;;
1341	esac
1342	;;
1343
1344panel)
1345	mkdev panel0 c %panel_chr% 0 660
1346	;;
1347
1348tslcd)
1349	mkdev tslcd0 c %tslcd_chr% 0 660
1350	;;
1351
1352ipty)
1353	mkdev ttyp0 c %pts_chr% 0 666
1354	mkdev ttyp1 c %pts_chr% 1 666
1355	mkdev ptyp0 c %ptc_chr% 0 666
1356	mkdev ptyp1 c %ptc_chr% 1 666
1357	;;
1358
1359ptm)
1360	mkdev ptmx c %ptm_chr% 0 666
1361	mkdev ptm c %ptm_chr% 1 666
1362	;;
1363
1364grf*)
1365	unit=${i#grf}
1366	mkdev grf$unit c %grf_chr% $unit 666
1367	;;
1368
1369etvme)
1370	mkdev etvme c %et_chr% 0
1371	;;
1372
1373leo*)
1374	unit=${i#leo}
1375	mkdev leo$unit c %leo_chr% $unit
1376	;;
1377
1378scif*)
1379	unit=${i#scif}
1380	mkdev scif$unit c %scif_chr% $unit "" "" $u_uucp
1381	;;
1382
1383sci*)
1384	unit=${i#sci}
1385	mkdev sci$unit c %sci_chr% $unit "" "" $u_uucp
1386	;;
1387
1388maple*)
1389	case $i in
1390	mapleA*) name="mapleA"; unit=0;;
1391	mapleB*) name="mapleB"; unit=1;;
1392	mapleC*) name="mapleC"; unit=2;;
1393	mapleD*) name="mapleD"; unit=3;;
1394	esac
1395	subunit=${i#$name}
1396	mkdev $name$subunit c %maple_chr% $(($unit * 8 + 0$subunit))
1397	;;
1398
1399mmem*)
1400	unit=${i#mmem}
1401	for pt in 0	# 1 2 3 4 ... 255
1402	do
1403#		mkdev mmem${unit}.${pt}a  b %mmem_blk% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator
1404		mkdev mmem${unit}.${pt}c  b %mmem_blk% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator
1405#		mkdev rmmem${unit}.${pt}a c %mmem_chr% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator
1406		mkdev rmmem${unit}.${pt}c c %mmem_chr% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator
1407	done
1408	;;
1409
1410mlcd*)
1411	unit=${i#mlcd}
1412	for pt in 0	# 1 2 3 4 ... 255
1413	do
1414		mkdev mlcd${unit}.${pt} c %mlcd_chr% $(($unit * 256 + $pt)) 640 $g_operator
1415	done
1416	;;
1417
1418ixpcom*)
1419	unit=${i#ixpcom}
1420	mkdev ixpcom$unit c %ixpcom_chr% $unit "" "" $u_uucp
1421	;;
1422
1423epcom*)
1424	unit=${i#epcom}
1425	mkdev epcom$unit c %epcom_chr% $unit "" "" $u_uucp
1426	;;
1427
1428ucbsnd)
1429	mkdev ucbsnd c %ucbsnd_chr% 0 666
1430	;;
1431
1432adb)
1433	mkdev adb c %aed_chr% 0 666
1434	;;
1435
1436asc*)
1437	unit=${i#asc}
1438	mkdev asc$unit c %asc_chr% $unit 666
1439	;;
1440
1441bwtwo*)
1442	unit=${i#bwtwo}
1443	mkdev bwtwo$unit c %bwtwo_chr% $unit 666
1444	;;
1445
1446cgtwo*)
1447	unit=${i#cgtwo}
1448	mkdev cgtwo$unit c %cgtwo_chr% $unit 666
1449	;;
1450
1451cgthree*)
1452	unit=${i#cgthree}
1453	mkdev cgthree$unit c %cgthree_chr% $unit 666
1454	;;
1455
1456cgfour*)
1457	unit=${i#cgfour}
1458	mkdev cgfour$unit c %cgfour_chr% $unit 666
1459	;;
1460
1461cgsix*)
1462	unit=${i#cgsix}
1463	mkdev cgsix$unit c %cgsix_chr% $unit 666
1464	;;
1465
1466cgeight*)
1467	unit=${i#cgeight}
1468	mkdev cgeight$unit c %cgeight_chr% $unit 666
1469	;;
1470
1471tcx*)
1472	unit=${i#tcx}
1473	mkdev tcx$unit c %tcx_chr% $unit 666
1474	;;
1475
1476xd*|xy*)
1477	case $i in
1478	xd*)	name=xd; unit=${i#xd}; blk=%xd_blk%;	chr=%xd_chr%;;
1479	xy*)	name=xy; unit=${i#xy}; blk=%xy_blk%;	chr=%xy_chr%;;
1480	esac
1481	%MKDISK% $name $unit $blk $chr
1482	;;
1483
1484magma*)
1485	unit=${i#magma}
1486	if [ 0$unit -gt 3 ]; then
1487		warn "bad unit for $i: $unit"
1488		break
1489	fi
1490	for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f
1491	do
1492		case $j in
1493		[0-9])	jn=$j ;;
1494		a)	jn=10 ;;
1495		b)	jn=11 ;;
1496		c)	jn=12 ;;
1497		d)	jn=13 ;;
1498		e)	jn=14 ;;
1499		f)	jn=15 ;;
1500		esac
1501		mkdev tty$unit$j c %mtty_chr% $(($unit * 64 + $jn))
1502	done
1503	mkdev bpp${unit}0 c %mbpp_chr% $(($unit * 64 + 0))
1504	mkdev bpp${unit}1 c %mbpp_chr% $(($unit * 64 + 1))
1505	;;
1506
1507clcd*)
1508	unit=${i#clcd}
1509	if [ 0$unit -gt 7 ]; then
1510		warn "bad unit for $i: $unit"
1511		break
1512	fi
1513	for j in 0 1 2 3 4 5 6 7
1514	do
1515		mkdev ttyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialin)) "" "" $u_uucp
1516		mkdev dtyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialout)) "" "" $u_uucp
1517	done
1518	;;
1519
1520spif*)
1521	unit=${i#spif}
1522	if [ 0$unit -gt 3 ]; then
1523		warn "bad unit for $i: $unit"
1524		break
1525	fi
1526	for j in 0 1 2 3 4 5 6 7; do
1527		mkdev ttyS$unit$j c 102 $(($unit * 64 + $j)) "" "" $u_uucp
1528	done
1529	mkdev bppS${unit}0 c 103 $(($unit * 64 + 0))
1530	mkdev bppS${unit}1 c 103 $(($unit * 64 + 1))
1531	;;
1532
1533bpp*)
1534	unit=${i#bpp}
1535	mkdev bpp$unit c %bpp_chr% $(($unit + 0))
1536	;;
1537
1538tctrl*)
1539	unit=${i#tctrl}
1540	mkdev tctrl$unit c %tctrl_chr% $unit 666
1541	;;
1542
1543bmd*)
1544	unit=${i#bmd}
1545	mkdev bmd${unit}a  b %bmd_blk% $(($unit * 8 + 0)) 640 $g_operator
1546	mkdev bmd${unit}c  b %bmd_blk% $(($unit * 8 + 2)) 640 $g_operator
1547	mkdev rbmd${unit}a c %bmd_chr% $(($unit * 8 + 0)) 640 $g_operator
1548	mkdev rbmd${unit}c c %bmd_chr% $(($unit * 8 + 2)) 640 $g_operator
1549	;;
1550
1551sram)
1552	mkdev sram c %sram_chr% 0 644
1553	;;
1554
1555pow*)
1556	unit=${i#pow}
1557	case $unit in
1558	0|1)
1559		mkdev pow${unit} c %pow_chr% ${unit} 644
1560		if [ $unit = 0 ]; then
1561			lndev pow${unit} pow
1562		fi
1563		;;
1564	*)
1565		warn "bad unit for pow in: $i"
1566		;;
1567	esac
1568	;;
1569
1570ttyS*)
1571	unit=${i#ttyS}
1572	mkdev ttyS$unit c %sacom_chr% $(($unit + $dialin )) "" "" $u_uucp
1573	mkdev dtyS$unit c %sacom_chr% $(($unit + $dialout)) "" "" $u_uucp
1574	;;
1575
1576atabus*)
1577	unit=${i#atabus}
1578	mkdev atabus$unit c %atabus_chr% $unit 644
1579	;;
1580
1581drvctl)
1582	mkdev drvctl c %drvctl_chr% 0 644
1583	;;
1584
1585tap*)
1586	unit=${i#tap}
1587	case "$unit" in
1588	[0-9]*)
1589		mkdev tap${unit} c %tap_chr% ${unit} 600
1590		;;
1591	*)
1592		mkdev tap c %tap_chr% 0xfffff 600
1593		;;
1594	esac
1595	;;
1596
1597fw*)
1598	unit=${i#fw}
1599	for j in 0 1 2 3
1600	do
1601		mkdev fw${unit}.${j} c %fw_chr% $((${unit} * 256 + ${j})) 660 ${g_operator}
1602		mkdev fwmem${unit}.${j} c %fw_chr% $((65536 + ${unit} * 256 + ${j})) 660 ${g_operator}
1603	done
1604	;;
1605
1606midevend)
1607%MI_DEVICES_END%
1608local)
1609	if [ -f "$0.local" ]; then
1610		umask 0
1611		sh $0.local all
1612		umask 077
1613	fi
1614	;;
1615
1616*)
1617	warn "$i: unknown device"
1618	;;
1619
1620esac
1621done
1622
1623}
1624
1625
1626# three variants of disk partitions - max 8, max 16, max 16 with highpartoffset
1627# hack; only the one used by port is retained in final MAKEDEV script
1628# routine is called as:
1629# makedisk name unit blk chr
1630makedisk_p8()
1631{
1632	name="$1"; unit="$2"; blk="$3"; chr="$4"
1633
1634	mkdev ${name}${unit}a	b $blk $(($unit * 8 + 0))	640 $g_operator
1635	mkdev ${name}${unit}b	b $blk $(($unit * 8 + 1))	640 $g_operator
1636	mkdev ${name}${unit}c	b $blk $(($unit * 8 + 2))	640 $g_operator
1637	mkdev ${name}${unit}d	b $blk $(($unit * 8 + 3))	640 $g_operator
1638	mkdev ${name}${unit}e	b $blk $(($unit * 8 + 4))	640 $g_operator
1639	mkdev ${name}${unit}f	b $blk $(($unit * 8 + 5))	640 $g_operator
1640	mkdev ${name}${unit}g	b $blk $(($unit * 8 + 6))	640 $g_operator
1641	mkdev ${name}${unit}h	b $blk $(($unit * 8 + 7))	640 $g_operator
1642	mkdev r${name}${unit}a	c $chr $(($unit * 8 + 0))	640 $g_operator
1643	mkdev r${name}${unit}b	c $chr $(($unit * 8 + 1))	640 $g_operator
1644	mkdev r${name}${unit}c	c $chr $(($unit * 8 + 2))	640 $g_operator
1645	mkdev r${name}${unit}d	c $chr $(($unit * 8 + 3))	640 $g_operator
1646	mkdev r${name}${unit}e	c $chr $(($unit * 8 + 4))	640 $g_operator
1647	mkdev r${name}${unit}f	c $chr $(($unit * 8 + 5))	640 $g_operator
1648	mkdev r${name}${unit}g	c $chr $(($unit * 8 + 6))	640 $g_operator
1649	mkdev r${name}${unit}h	c $chr $(($unit * 8 + 7))	640 $g_operator
1650}
1651
1652makedisk_p16()
1653{
1654	name="$1"; unit="$2"; blk="$3"; chr="$4"
1655
1656	mkdev ${name}${unit}a	b $blk $(($unit * 16 + 0))	640 $g_operator
1657	mkdev ${name}${unit}b	b $blk $(($unit * 16 + 1))	640 $g_operator
1658	mkdev ${name}${unit}c	b $blk $(($unit * 16 + 2))	640 $g_operator
1659	mkdev ${name}${unit}d	b $blk $(($unit * 16 + 3))	640 $g_operator
1660	mkdev ${name}${unit}e	b $blk $(($unit * 16 + 4))	640 $g_operator
1661	mkdev ${name}${unit}f	b $blk $(($unit * 16 + 5))	640 $g_operator
1662	mkdev ${name}${unit}g	b $blk $(($unit * 16 + 6))	640 $g_operator
1663	mkdev ${name}${unit}h	b $blk $(($unit * 16 + 7))	640 $g_operator
1664	mkdev ${name}${unit}i	b $blk $(($unit * 16 + 8))	640 $g_operator
1665	mkdev ${name}${unit}j	b $blk $(($unit * 16 + 9))	640 $g_operator
1666	mkdev ${name}${unit}k	b $blk $(($unit * 16 + 10))	640 $g_operator
1667	mkdev ${name}${unit}l	b $blk $(($unit * 16 + 11))	640 $g_operator
1668	mkdev ${name}${unit}m	b $blk $(($unit * 16 + 12))	640 $g_operator
1669	mkdev ${name}${unit}n	b $blk $(($unit * 16 + 13))	640 $g_operator
1670	mkdev ${name}${unit}o	b $blk $(($unit * 16 + 14))	640 $g_operator
1671	mkdev ${name}${unit}p	b $blk $(($unit * 16 + 15))	640 $g_operator
1672	mkdev r${name}${unit}a	c $chr $(($unit * 16 + 0))	640 $g_operator
1673	mkdev r${name}${unit}b	c $chr $(($unit * 16 + 1))	640 $g_operator
1674	mkdev r${name}${unit}c	c $chr $(($unit * 16 + 2))	640 $g_operator
1675	mkdev r${name}${unit}d	c $chr $(($unit * 16 + 3))	640 $g_operator
1676	mkdev r${name}${unit}e	c $chr $(($unit * 16 + 4))	640 $g_operator
1677	mkdev r${name}${unit}f	c $chr $(($unit * 16 + 5))	640 $g_operator
1678	mkdev r${name}${unit}g	c $chr $(($unit * 16 + 6))	640 $g_operator
1679	mkdev r${name}${unit}h	c $chr $(($unit * 16 + 7))	640 $g_operator
1680	mkdev r${name}${unit}i	c $chr $(($unit * 16 + 8))	640 $g_operator
1681	mkdev r${name}${unit}j	c $chr $(($unit * 16 + 9))	640 $g_operator
1682	mkdev r${name}${unit}k	c $chr $(($unit * 16 + 10))	640 $g_operator
1683	mkdev r${name}${unit}l	c $chr $(($unit * 16 + 11))	640 $g_operator
1684	mkdev r${name}${unit}m	c $chr $(($unit * 16 + 12))	640 $g_operator
1685	mkdev r${name}${unit}n	c $chr $(($unit * 16 + 13))	640 $g_operator
1686	mkdev r${name}${unit}o	c $chr $(($unit * 16 + 14))	640 $g_operator
1687	mkdev r${name}${unit}p	c $chr $(($unit * 16 + 15))	640 $g_operator
1688}
1689
1690makedisk_p16high()
1691{
1692	ho=524280	# offset for partition 9 to 16
1693	name="$1"; unit="$2"; blk="$3"; chr="$4"
1694
1695	mkdev ${name}${unit}a	b $blk $(($unit * 8 + 0))	640 $g_operator
1696	mkdev ${name}${unit}b	b $blk $(($unit * 8 + 1))	640 $g_operator
1697	mkdev ${name}${unit}c	b $blk $(($unit * 8 + 2))	640 $g_operator
1698	mkdev ${name}${unit}d	b $blk $(($unit * 8 + 3))	640 $g_operator
1699	mkdev ${name}${unit}e	b $blk $(($unit * 8 + 4))	640 $g_operator
1700	mkdev ${name}${unit}f	b $blk $(($unit * 8 + 5))	640 $g_operator
1701	mkdev ${name}${unit}g	b $blk $(($unit * 8 + 6))	640 $g_operator
1702	mkdev ${name}${unit}h	b $blk $(($unit * 8 + 7))	640 $g_operator
1703	mkdev ${name}${unit}i	b $blk $(($unit * 8 + $ho + 8))	640 $g_operator
1704	mkdev ${name}${unit}j	b $blk $(($unit * 8 + $ho + 9))	640 $g_operator
1705	mkdev ${name}${unit}k	b $blk $(($unit * 8 + $ho + 10)) 640 $g_operator
1706	mkdev ${name}${unit}l	b $blk $(($unit * 8 + $ho + 11)) 640 $g_operator
1707	mkdev ${name}${unit}m	b $blk $(($unit * 8 + $ho + 12)) 640 $g_operator
1708	mkdev ${name}${unit}n	b $blk $(($unit * 8 + $ho + 13)) 640 $g_operator
1709	mkdev ${name}${unit}o	b $blk $(($unit * 8 + $ho + 14)) 640 $g_operator
1710	mkdev ${name}${unit}p	b $blk $(($unit * 8 + $ho + 15)) 640 $g_operator
1711	mkdev r${name}${unit}a	c $chr $(($unit * 8 + 0))	640 $g_operator
1712	mkdev r${name}${unit}b	c $chr $(($unit * 8 + 1))	640 $g_operator
1713	mkdev r${name}${unit}c	c $chr $(($unit * 8 + 2))	640 $g_operator
1714	mkdev r${name}${unit}d	c $chr $(($unit * 8 + 3))	640 $g_operator
1715	mkdev r${name}${unit}e	c $chr $(($unit * 8 + 4))	640 $g_operator
1716	mkdev r${name}${unit}f	c $chr $(($unit * 8 + 5))	640 $g_operator
1717	mkdev r${name}${unit}g	c $chr $(($unit * 8 + 6))	640 $g_operator
1718	mkdev r${name}${unit}h	c $chr $(($unit * 8 + 7))	640 $g_operator
1719	mkdev r${name}${unit}i	c $chr $(($unit * 8 + $ho + 8))	640 $g_operator
1720	mkdev r${name}${unit}j	c $chr $(($unit * 8 + $ho + 9))	640 $g_operator
1721	mkdev r${name}${unit}k	c $chr $(($unit * 8 + $ho + 10)) 640 $g_operator
1722	mkdev r${name}${unit}l	c $chr $(($unit * 8 + $ho + 11)) 640 $g_operator
1723	mkdev r${name}${unit}m	c $chr $(($unit * 8 + $ho + 12)) 640 $g_operator
1724	mkdev r${name}${unit}n	c $chr $(($unit * 8 + $ho + 13)) 640 $g_operator
1725	mkdev r${name}${unit}o	c $chr $(($unit * 8 + $ho + 14)) 640 $g_operator
1726	mkdev r${name}${unit}p	c $chr $(($unit * 8 + $ho + 15)) 640 $g_operator
1727}
1728
1729# make only the very few basic disk device nodes - 'a' partition
1730# and raw partition
1731makedisk_minimal()
1732{
1733	name=$1; unit=$2; blk=$3; chr=$4
1734	doff=%DISKMINOROFFSET%
1735	ro=%RAWDISK_OFF%
1736	rn=%RAWDISK_NAME%
1737
1738	mkdev ${name}${unit}a	b $blk $(($unit * $doff + 0))	640 $g_operator
1739	mkdev ${name}${unit}$rn	b $blk $(($unit * $doff + $ro))	640 $g_operator
1740	mkdev r${name}${unit}a	c $chr $(($unit * $doff + 0))	640 $g_operator
1741	mkdev r${name}${unit}$rn c $chr $(($unit * $doff + $ro)) 640 $g_operator
1742}
1743
1744makedev $*
1745