diff --git a/share/man/man4/pcm.4 b/share/man/man4/pcm.4
index 17ac499e6bb3..e406bd2c8343 100644
--- a/share/man/man4/pcm.4
+++ b/share/man/man4/pcm.4
@@ -1,706 +1,677 @@
 .\"
 .\" Copyright (c) 2009-2011 Joel Dahl <joel@FreeBSD.org>
 .\" All rights reserved.
 .\"
 .\" Redistribution and use in source and binary forms, with or without
 .\" modification, are permitted provided that the following conditions
 .\" are met:
 .\" 1. Redistributions of source code must retain the above copyright
 .\"    notice, this list of conditions and the following disclaimer.
 .\" 2. Redistributions in binary form must reproduce the above copyright
 .\"    notice, this list of conditions and the following disclaimer in the
 .\"    documentation and/or other materials provided with the distribution.
 .\"
 .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 .\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd January 10, 2024
+.Dd March 24, 2024
 .Dt SOUND 4
 .Os
 .Sh NAME
 .Nm sound ,
 .Nm pcm ,
 .Nm snd
 .Nd
 .Fx
 PCM audio device infrastructure
 .Sh SYNOPSIS
 To compile this driver into the kernel, place the following line in your
 kernel configuration file:
 .Bd -ragged -offset indent
 .Cd "device sound"
 .Ed
 .Sh DESCRIPTION
 The
 .Nm
 driver is the main component of the
 .Fx
 sound system.
 It works in conjunction with a bridge device driver on supported devices
 and provides PCM audio record and playback once it attaches.
 Each bridge device driver supports a specific set of audio chipsets and
 needs to be enabled together with the
 .Nm
 driver.
 PCI and ISA PnP audio devices identify themselves so users are usually not
 required to add anything to
 .Pa /boot/device.hints .
 .Pp
 Some of the main features of the
 .Nm
 driver are: multichannel audio, per-application
 volume control, dynamic mixing through virtual sound channels, true full
 duplex operation, bit perfect audio, rate conversion and low latency
 modes.
 .Pp
 The
 .Nm
 driver is enabled by default, along with several bridge device drivers.
 Those not enabled by default can be loaded during runtime with
 .Xr kldload 8
 or during boot via
 .Xr loader.conf 5 .
 The following bridge device drivers are available:
 .Pp
 .Bl -bullet -compact
 .It
 .Xr snd_ai2s 4 (enabled by default on powerpc)
 .It
 .Xr snd_als4000 4
 .It
 .Xr snd_atiixp 4
 .It
 .Xr snd_cmi 4 (enabled by default on amd64, i386)
 .It
 .Xr snd_cs4281 4
 .It
 .Xr snd_csa 4 (enabled by default on amd64, i386)
 .It
 .Xr snd_davbus 4 (enabled by default on powerpc)
 .It
 .Xr snd_emu10k1 4
 .It
 .Xr snd_emu10kx 4 (enabled by default on amd64, i386)
 .It
 .Xr snd_envy24 4
 .It
 .Xr snd_envy24ht 4
 .It
 .Xr snd_es137x 4 (enabled by default on amd64, i386)
 .It
 .Xr snd_fm801 4
 .It
 .Xr snd_hda 4 (enabled by default on amd64, i386)
 .It
 .Xr snd_hdspe 4
 .It
 .Xr snd_ich 4 (enabled by default on amd64, i386)
 .It
 .Xr snd_maestro3 4
 .It
 .Xr snd_neomagic 4
 .It
 .Xr snd_solo 4
 .It
 .Xr snd_spicds 4
 .It
 .Xr snd_uaudio 4 (auto-loaded on device plug)
 .It
 .Xr snd_via8233 4 (enabled by default on amd64, i386)
 .It
 .Xr snd_via82c686 4
 .It
 .Xr snd_vibes 4
 .El
 .Pp
 Refer to the manual page for each bridge device driver for driver specific
 settings and information.
 .Ss Boot Variables
 In general, the module
 .Pa snd_foo
 corresponds to
 .Cd "device snd_foo"
 and can be
 loaded by the boot
 .Xr loader 8
 via
 .Xr loader.conf 5
 or from the command line using the
 .Xr kldload 8
 utility.
 Options which can be specified in
 .Pa /boot/loader.conf
 include:
 .Bl -tag -width ".Va snd_driver_load" -offset indent
 .It Va snd_driver_load
 .Pq Dq Li NO
 If set to
 .Dq Li YES ,
 this option loads all available drivers.
 .It Va snd_hda_load
 .Pq Dq Li NO
 If set to
 .Dq Li YES ,
 only the Intel High Definition Audio bridge device driver and dependent
 modules will be loaded.
 .It Va snd_foo_load
 .Pq Dq Li NO
 If set to
 .Dq Li YES ,
 load driver for card/chipset foo.
 .El
 .Pp
 To define default values for the different mixer channels,
 set the channel to the preferred value using hints, e.g.:
 .Va hint.pcm.0.line Ns = Ns Qq Li 0 .
 This will mute the input channel per default.
 .Ss Multichannel Audio
 Multichannel audio, popularly referred to as
 .Dq surround sound
 is supported and enabled by default.
 The
 .Fx
 multichannel matrix processor supports up to 18 interleaved channels, but the
 limit is currently set to 8 channels (as commonly used for 7.1 surround sound).
 The internal matrix mapping can handle reduction, expansion or
 re-routing of channels.
 This provides a base interface for related multichannel
 .Fn ioctl
 support.
 Multichannel audio works both with and without VCHANs.
 .Pp
 Most bridge device drivers are still missing multichannel matrixing
 support, but in most cases this should be trivial to implement.
 Use the
 .Va dev.pcm.%d.[play|rec].vchanformat
 .Xr sysctl 8
 to adjust the number of channels used.
 The current multichannel interleaved structure and arrangement was
 implemented by inspecting various popular UNIX applications.
 There were no single standard, so much care has been taken to try
 to satisfy each possible scenario, despite the fact that each
 application has its own conflicting standard.
 .Ss EQ
 The Parametric Software Equalizer (EQ) enables the use of
 .Dq tone
 controls (bass and treble).
 Commonly used for ear-candy or frequency compensation due to the vast
 difference in hardware quality.
 EQ is disabled by default, but can be enabled with the
 .Va hint.pcm.%d.eq
 tunable.
 .Ss VCHANs
 Each device can optionally support more playback and recording channels
 than physical hardware provides by using
 .Dq virtual channels
 or VCHANs.
 VCHAN options can be configured via the
 .Xr sysctl 8
 interface but can only be manipulated while the device is inactive.
 .Ss VPC
 .Fx
 supports independent and individual volume controls for each active
 application, without touching the master
 .Nm
 volume.
 This is sometimes referred to as Volume Per Channel (VPC).
 The VPC feature is enabled by default.
 .Ss Loader Tunables
 The following loader tunables are used to set driver configuration at the
 .Xr loader 8
 prompt before booting the kernel, or they can be stored in
 .Pa /boot/loader.conf
 in order to automatically set them before booting the kernel.
 It is also possible to use
 .Xr kenv 1
 to change these tunables before loading the
 .Nm
 driver.
 The following tunables can not be changed during runtime using
 .Xr sysctl 8 .
 .Bl -tag -width indent
 .It Va hint.pcm.%d.eq
 Set to 1 or 0 to explicitly enable (1) or disable (0) the equalizer.
 Requires a driver reload if changed.
 Enabling this will make bass and treble controls appear in mixer applications.
 This tunable is undefined by default.
 Equalizing is disabled by default.
 .It Va hint.pcm.%d.vpc
 Set to 1 or 0 to explicitly enable (1) or disable (0) the VPC feature.
 This tunable is undefined by default.
 VPC is however enabled by default.
 .El
 .Ss Runtime Configuration
 There are a number of
 .Xr sysctl 8
 variables available which can be modified during runtime.
 These values can also be stored in
 .Pa /etc/sysctl.conf
 in order to automatically set them during the boot process.
 .Va hw.snd.*
 are global settings and
 .Va dev.pcm.*
 are device specific.
 .Bl -tag -width indent
 .It Va hw.snd.compat_linux_mmap
 Linux
 .Xr mmap 2
 compatibility.
 The following values are supported (default is 0):
 .Bl -tag -width 2n
 .It -1
 Force disabling/denying PROT_EXEC
 .Xr mmap 2
 requests.
 .It 0
 Auto detect proc/ABI type, allow
 .Xr mmap 2
 for Linux applications, and deny for everything else.
 .It 1
 Always allow PROT_EXEC page mappings.
 .El
 .It Va hw.snd.default_auto
 Automatically assign the default sound unit.
 The following values are supported (default is 1):
 .Bl -tag -width 2n
 .It 0
 Do not assign the default sound unit automatically.
 .It 1
 Use the best available sound device based on playing and recording
 capabilities of the device.
 .It 2
 Use the most recently attached device.
 .El
 .It Va hw.snd.default_unit
 Default sound card for systems with multiple sound cards.
 When using
 .Xr devfs 5 ,
 the default device for
 .Pa /dev/dsp .
 Equivalent to a symlink from
 .Pa /dev/dsp
 to
 .Pa /dev/dsp Ns Va ${hw.snd.default_unit} .
 .It Va hw.snd.feeder_eq_exact_rate
 Only certain rates are allowed for precise processing.
 The default behavior is however to allow sloppy processing for all rates,
 even the unsupported ones.
 Enable to toggle this requirement and only allow processing for supported
 rates.
 .It Va hw.snd.feeder_rate_max
 Maximum allowable sample rate.
 .It Va hw.snd.feeder_rate_min
 Minimum allowable sample rate.
 .It Va hw.snd.feeder_rate_polyphase_max
 Adjust to set the maximum number of allowed polyphase entries during the
 process of building resampling filters.
 Disabling polyphase resampling has the benefit of reducing memory usage, at
 the expense of slower and lower quality conversion.
 Only applicable when the SINC interpolator is used.
 Default value is 183040.
 Set to 0 to disable polyphase resampling.
 .It Va hw.snd.feeder_rate_quality
 Sample rate converter quality.
 Default value is 1, linear interpolation.
 Available options include:
 .Bl -tag -width 2n
 .It 0
 Zero Order Hold, ZOH.
 Very fast, but with poor quality.
 .It 1
 Linear interpolation.
 Fast, quality is subject to personal preference.
 Technically the quality is poor however, due to the lack of anti-aliasing
 filtering.
 .It 2
 Bandlimited SINC interpolator.
 Implements polyphase banking to boost the conversion speed, at the cost of
 memory usage, with multiple high quality polynomial interpolators to improve
 the conversion accuracy.
 100% fixed point, 64bit accumulator with 32bit coefficients and high precision
 sample buffering.
 Quality values are 100dB stopband, 8 taps and 85% bandwidth.
 .It 3
 Continuation of the bandlimited SINC interpolator, with 100dB stopband, 36
 taps and 90% bandwidth as quality values.
 .It 4
 Continuation of the bandlimited SINC interprolator, with 100dB stopband, 164
 taps and 97% bandwidth as quality values.
 .El
 .It Va hw.snd.feeder_rate_round
 Sample rate rounding threshold, to avoid large prime division at the
 cost of accuracy.
 All requested sample rates will be rounded to the nearest threshold value.
 Possible values range between 0 (disabled) and 500.
 Default is 25.
 .It Va hw.snd.latency
 Configure the buffering latency.
 Only affects applications that do not explicitly request
 blocksize / fragments.
 This tunable provides finer granularity than the
 .Va hw.snd.latency_profile
 tunable.
 Possible values range between 0 (lowest latency) and 10 (highest latency).
 .It Va hw.snd.latency_profile
 Define sets of buffering latency conversion tables for the
 .Va hw.snd.latency
 tunable.
 A value of 0 will use a low and aggressive latency profile which can result
 in possible underruns if the application cannot keep up with a rapid irq
 rate, especially during high workload.
 The default value is 1, which is considered a moderate/safe latency profile.
 .It Va hw.snd.maxautovchans
 Global VCHAN setting that only affects devices with at least one playback or
 recording channel available.
 The sound system will dynamically create up to this many VCHANs.
 Set to
 .Dq 0
 if no VCHANs are desired.
 Maximum value is 256.
 .It Va hw.snd.report_soft_formats
 Controls the internal format conversion if it is
 available transparently to the application software.
 When disabled or not available, the application will
 only be able to select formats the device natively supports.
 .It Va hw.snd.report_soft_matrix
 Enable seamless channel matrixing even if the hardware does not support it.
 Makes it possible to play multichannel streams even with a simple stereo
 sound card.
 .It Va hw.snd.verbose
 Level of verbosity for the
 .Pa /dev/sndstat
 device.
 Higher values include more output and the highest level,
 four, should be used when reporting problems.
 Other options include:
 .Bl -tag -width 2n
 .It 0
 Installed devices and their allocated bus resources.
 .It 1
 The number of playback, record, virtual channels, and
 flags per device.
 .It 2
 Channel information per device including the channel's
 current format, speed, and pseudo device statistics such as
 buffer overruns and buffer underruns.
 .It 3
 File names and versions of the currently loaded sound modules.
 .It 4
 Various messages intended for debugging.
 .El
 .It Va hw.snd.vpc_0db
 Default value for
 .Nm
 volume.
 Increase to give more room for attenuation control.
 Decrease for more amplification, with the possible cost of sound clipping.
 .It Va hw.snd.vpc_autoreset
 When a channel is closed the channel volume will be reset to 0db.
 This means that any changes to the volume will be lost.
 Enabling this will preserve the volume, at the cost of possible confusion
 when applications tries to re-open the same device.
 .It Va hw.snd.vpc_mixer_bypass
 The recommended way to use the VPC feature is to teach applications to use the
 correct
 .Fn ioctl :
 .Dv SNDCTL_DSP_GETPLAYVOL , SNDCTL_DSP_SETPLAYVOL ,
 .Dv SNDCTL_DSP_SETRECVOL , SNDCTL_DSP_SETRECVOL .
 This is however not always possible.
 Enable this to allow applications to use their own existing mixer logic
 to control their own channel volume.
 .It Va hw.snd.vpc_reset
 Enable to restore all channel volumes back to the default value of 0db.
 .It Va dev.pcm.%d.bitperfect
 Enable or disable bitperfect mode.
 When enabled, channels will skip all dsp processing, such as channel
 matrixing, rate converting and equalizing.
 The pure
 .Nm
 stream will be fed directly to the hardware.
 If VCHANs are enabled, the bitperfect mode will use the VCHAN format/rate as
 the definitive format/rate target.
 The recommended way to use bitperfect mode is to disable VCHANs and enable this
 sysctl.
 Default is disabled.
 .It Va dev.pcm.%d.[play|rec].vchans
 The current number of VCHANs allocated per device.
 This can be set to preallocate a certain number of VCHANs.
 Setting this value to
 .Dq 0
 will disable VCHANs for this device.
 .It Va dev.pcm.%d.[play|rec].vchanformat
 Format for VCHAN mixing.
 All playback paths will be converted to this format before the mixing
 process begins.
 By default only 2 channels are enabled.
 Available options include:
 .Bl -tag -width 2n
 .It s16le:1.0
 Mono.
 .It s16le:2.0
 Stereo, 2 channels (left, right).
 .It s16le:2.1
 3 channels (left, right, LFE).
 .It s16le:3.0
 3 channels (left, right, rear center).
 .It s16le:4.0
 Quadraphonic, 4 channels (front/rear left and right).
 .It s16le:4.1
 5 channels (4.0 + LFE).
 .It s16le:5.0
 5 channels (4.0 + center).
 .It s16le:5.1
 6 channels (4.0 + center + LFE).
 .It s16le:6.0
 6 channels (4.0 + front/rear center).
 .It s16le:6.1
 7 channels (6.0 + LFE).
 .It s16le:7.1
 8 channels (4.0 + center + LFE + left and right side).
 .El
 .It Va dev.pcm.%d.[play|rec].vchanmode
 VCHAN format/rate selection.
 Available options include:
 .Bl -tag -width 2n
 .It fixed
 Channel mixing is done using fixed format/rate.
 Advanced operations such as digital passthrough will not work.
 Can be considered as a
 .Dq legacy
 mode.
 This is the default mode for hardware channels which lack support for digital
 formats.
 .It passthrough
 Channel mixing is done using fixed format/rate, but advanced operations such
 as digital passthrough also work.
 All channels will produce sound as usual until a digital format playback is
 requested.
 When this happens all other channels will be muted and the latest incoming
 digital format will be allowed to pass through undisturbed.
 Multiple concurrent digital streams are supported, but the latest stream will
 take precedence and mute all other streams.
 .It adaptive
 Works like the
 .Dq passthrough
 mode, but is a bit smarter, especially for
 multiple
 .Nm
 channels with different format/rate.
 When a new channel is about to start, the entire list of virtual channels will
 be scanned, and the channel with the best format/rate (usually the
 highest/biggest) will be selected.
 This ensures that mixing quality depends on the best channel.
 The downside is that the hardware DMA mode needs to be restarted, which may
 cause annoying pops or clicks.
 .El
 .It Va dev.pcm.%d.[play|rec].vchanrate
 Sample rate speed for VCHAN mixing.
 All playback paths will be converted to this sample rate before the mixing
 process begins.
 .It Va dev.pcm.%d.polling
 Experimental polling mode support where the driver operates by querying the
 device state on each tick using a
 .Xr callout 9
 mechanism.
 Disabled by default and currently only available for a few device drivers.
 .El
-.Ss Recording Channels
-On devices that have more than one recording source (ie: mic and line),
-there is a corresponding
-.Pa /dev/dsp%d.r%d
-device.
-The
-.Xr mixer 8
-utility can be used to start and stop recording from an specific device.
 .Ss Statistics
 Channel statistics are only kept while the device is open.
 So with situations involving overruns and underruns, consider the output
 while the errant application is open and running.
 .Ss IOCTL Support
 The driver supports most of the OSS
 .Fn ioctl
 functions, and most applications work unmodified.
 A few differences exist, while memory mapped playback is
 supported natively and in Linux emulation, memory mapped recording is not due
 to VM system design.
 As a consequence, some applications may need to be recompiled
 with a slightly modified audio module.
 See
 .In sys/soundcard.h
 for a complete list of the supported
 .Fn ioctl
 functions.
 .Sh FILES
 The
 .Nm
-drivers may create the following
-device nodes:
+drivers may create the following device nodes:
 .Pp
-.Bl -tag -width ".Pa /dev/audio%d.%d" -compact
-.It Pa /dev/audio%d.%d
-Sparc-compatible audio device.
-.It Pa /dev/dsp%d.%d
-Digitized voice device.
-.It Pa /dev/dspW%d.%d
-Like
-.Pa /dev/dsp ,
-but 16 bits per sample.
-.It Pa /dev/dsp%d.p%d
-Playback channel.
-.It Pa /dev/dsp%d.r%d
-Record channel.
-.It Pa /dev/dsp%d.vp%d
-Virtual playback channel.
-.It Pa /dev/dsp%d.vr%d
-Virtual recording channel.
+.Bl -tag -width ".Pa /dev/sndstat" -compact
+.It Pa /dev/dsp%d
+Audio device.
+The number represents the unit number of the device.
+.It Pa /dev/dsp
+Alias of
+.Pa /dev/dsp${hw.snd.default_unit} .
+Available only if
+.Pa hw.snd.basename_clone
+is set.
 .It Pa /dev/sndstat
 Current
 .Nm
 status, including all channels and drivers.
 .El
 .Pp
-The first number in the device node
-represents the unit number of the
-.Nm
-device.
 All
 .Nm
 devices are listed
 in
 .Pa /dev/sndstat .
 Additional messages are sometimes recorded when the
 device is probed and attached, these messages can be viewed with the
 .Xr dmesg 8
 utility.
-.Pp
-The above device nodes are only created on demand through the dynamic
-.Xr devfs 5
-clone handler.
-Users are strongly discouraged to access them directly.
-For specific sound card access, please instead use
-.Pa /dev/dsp
-or
-.Pa /dev/dsp%d .
 .Sh EXAMPLES
 Use the sound metadriver to load all
 .Nm
 bridge device drivers at once
 (for example if it is unclear which the correct driver to use is):
 .Pp
 .Dl kldload snd_driver
 .Pp
 Load a specific bridge device driver, in this case the Intel
 High Definition Audio driver:
 .Pp
 .Dl kldload snd_hda
 .Pp
 Check the status of all detected
 .Nm
 devices:
 .Pp
 .Dl cat /dev/sndstat
 .Pp
 Change the default sound device, in this case to the second device.
 This is handy if there are multiple
 .Nm
 devices available:
 .Pp
 .Dl mixer -d pcm1
 .Sh DIAGNOSTICS
 .Bl -diag
 .It pcm%d:play:%d:dsp%d.p%d: play interrupt timeout, channel dead
 The hardware does not generate interrupts to serve incoming (play)
 or outgoing (record) data.
 .It unsupported subdevice XX
 A device node is not created properly.
 .El
 .Sh SEE ALSO
 .Xr snd_ai2s 4 ,
 .Xr snd_als4000 4 ,
 .Xr snd_atiixp 4 ,
 .Xr snd_cmi 4 ,
 .Xr snd_cs4281 4 ,
 .Xr snd_csa 4 ,
 .Xr snd_davbus 4 ,
 .Xr snd_emu10k1 4 ,
 .Xr snd_emu10kx 4 ,
 .Xr snd_envy24 4 ,
 .Xr snd_envy24ht 4 ,
 .Xr snd_es137x 4 ,
 .Xr snd_fm801 4 ,
 .Xr snd_hda 4 ,
 .Xr snd_hdspe 4 ,
 .Xr snd_ich 4 ,
 .Xr snd_maestro3 4 ,
 .Xr snd_neomagic 4 ,
 .Xr snd_solo 4 ,
 .Xr snd_spicds 4 ,
 .Xr snd_t4dwave 4 ,
 .Xr snd_uaudio 4 ,
 .Xr snd_via8233 4 ,
 .Xr snd_via82c686 4 ,
 .Xr snd_vibes 4 ,
 .Xr devfs 5 ,
 .Xr device.hints 5 ,
 .Xr loader.conf 5 ,
 .Xr dmesg 8 ,
 .Xr kldload 8 ,
 .Xr mixer 8 ,
 .Xr sysctl 8
 .Rs
 .%T "Cookbook formulae for audio EQ biquad filter coefficients (Audio-EQ-Cookbook.txt), by Robert Bristow-Johnson"
 .%U "https://www.musicdsp.org/en/latest/Filters/197-rbj-audio-eq-cookbook.html"
 .Re
 .Rs
 .%T "Julius O'Smith's Digital Audio Resampling"
 .%U "http://ccrma.stanford.edu/~jos/resample/"
 .Re
 .Rs
 .%T "Polynomial Interpolators for High-Quality Resampling of Oversampled Audio, by Olli Niemitalo"
 .%U "http://yehar.com/blog/wp-content/uploads/2009/08/deip.pdf"
 .Re
 .Rs
 .%T "The OSS API"
 .%U "http://www.opensound.com/pguide/oss.pdf"
 .Re
 .Sh HISTORY
 The
 .Nm
 device driver first appeared in
 .Fx 2.2.6
 as
 .Nm pcm ,
 written by
 .An Luigi Rizzo .
 It was later
 rewritten in
 .Fx 4.0
 by
 .An Cameron Grant .
 The API evolved from the VOXWARE
 standard which later became OSS standard.
 .Sh AUTHORS
 .An -nosplit
 .An Luigi Rizzo Aq Mt luigi@iet.unipi.it
 initially wrote the
 .Nm pcm
 device driver and this manual page.
 .An Cameron Grant Aq Mt gandalf@vilnya.demon.co.uk
 later revised the device driver for
 .Fx 4.0 .
 .An Seigo Tanimura Aq Mt tanimura@r.dl.itc.u-tokyo.ac.jp
 revised this manual page.
 It was then rewritten for
 .Fx 5.2 .
 .Sh BUGS
 Some features of your sound card (e.g., global volume control) might not
 be supported on all devices.
diff --git a/sys/conf/files b/sys/conf/files
index 549a3590f76b..0fbb7fea70c9 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -1,5248 +1,5247 @@
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
 # dependency lines other than the first are silently ignored.
 #
 acpi_quirks.h			optional acpi				   \
 	dependency	"$S/tools/acpi_quirks2h.awk $S/dev/acpica/acpi_quirks" \
 	compile-with	"${AWK} -f $S/tools/acpi_quirks2h.awk $S/dev/acpica/acpi_quirks" \
 	no-obj no-implicit-rule before-depend				   \
 	clean		"acpi_quirks.h"
 bhnd_nvram_map.h		optional bhnd				   \
 	dependency	"$S/dev/bhnd/tools/nvram_map_gen.sh $S/dev/bhnd/tools/nvram_map_gen.awk $S/dev/bhnd/nvram/nvram_map" \
 	compile-with	"sh $S/dev/bhnd/tools/nvram_map_gen.sh $S/dev/bhnd/nvram/nvram_map -h" \
 	no-obj no-implicit-rule before-depend				   \
 	clean		"bhnd_nvram_map.h"
 bhnd_nvram_map_data.h		optional bhnd				   \
 	dependency	"$S/dev/bhnd/tools/nvram_map_gen.sh $S/dev/bhnd/tools/nvram_map_gen.awk $S/dev/bhnd/nvram/nvram_map" \
 	compile-with	"sh $S/dev/bhnd/tools/nvram_map_gen.sh $S/dev/bhnd/nvram/nvram_map -d" \
 	no-obj no-implicit-rule before-depend				   \
 	clean		"bhnd_nvram_map_data.h"
 fdt_static_dtb.h		optional fdt fdt_dtb_static \
 	compile-with "sh -c 'MACHINE=${MACHINE} $S/tools/fdt/make_dtbh.sh ${FDT_DTS_FILE} ${.CURDIR}'" \
 	dependency	"${FDT_DTS_FILE:T:R}.dtb" \
 	no-obj no-implicit-rule before-depend \
 	clean		"fdt_static_dtb.h"
 feeder_eq_gen.h			optional sound				   \
 	dependency	"$S/tools/sound/feeder_eq_mkfilter.awk"		   \
 	compile-with	"${AWK} -f $S/tools/sound/feeder_eq_mkfilter.awk -- ${FEEDER_EQ_PRESETS} > feeder_eq_gen.h" \
 	no-obj no-implicit-rule before-depend				   \
 	clean		"feeder_eq_gen.h"
 feeder_rate_gen.h		optional sound				   \
 	dependency	"$S/tools/sound/feeder_rate_mkfilter.awk"	   \
 	compile-with	"${AWK} -f $S/tools/sound/feeder_rate_mkfilter.awk -- ${FEEDER_RATE_PRESETS} > feeder_rate_gen.h" \
 	no-obj no-implicit-rule before-depend				   \
 	clean		"feeder_rate_gen.h"
 font.h				optional	sc_dflt_font		\
 	compile-with	"uudecode < ${SRCTOP}/share/syscons/fonts/${SC_DFLT_FONT}-8x16.fnt && file2c 'u_char dflt_font_16[16*256] = {' '};' < ${SC_DFLT_FONT}-8x16 > font.h && uudecode < ${SRCTOP}/share/syscons/fonts/${SC_DFLT_FONT}-8x14.fnt && file2c 'u_char dflt_font_14[14*256] = {' '};' < ${SC_DFLT_FONT}-8x14 >> font.h && uudecode < ${SRCTOP}/share/syscons/fonts/${SC_DFLT_FONT}-8x8.fnt && file2c 'u_char dflt_font_8[8*256] = {' '};' < ${SC_DFLT_FONT}-8x8 >> font.h"									\
 	no-obj no-implicit-rule before-depend				\
 	clean		"font.h ${SC_DFLT_FONT}-8x14 ${SC_DFLT_FONT}-8x16 ${SC_DFLT_FONT}-8x8"
 snd_fxdiv_gen.h			optional sound				   \
 	dependency	"$S/tools/sound/snd_fxdiv_gen.awk"		   \
 	compile-with	"${AWK} -f $S/tools/sound/snd_fxdiv_gen.awk -- > snd_fxdiv_gen.h" \
 	no-obj no-implicit-rule before-depend				   \
 	clean		"snd_fxdiv_gen.h"
 miidevs.h			optional miibus | mii			   \
 	dependency	"$S/tools/miidevs2h.awk $S/dev/mii/miidevs"	   \
 	compile-with	"${AWK} -f $S/tools/miidevs2h.awk $S/dev/mii/miidevs" \
 	no-obj no-implicit-rule before-depend				   \
 	clean		"miidevs.h"
 kbdmuxmap.h			optional	kbdmux_dflt_keymap 	   \
 	compile-with	"${KEYMAP} -L ${KBDMUX_DFLT_KEYMAP} | ${KEYMAP_FIX} > ${.TARGET}" \
 	no-obj no-implicit-rule before-depend				\
 	clean		"kbdmuxmap.h"
 teken_state.h		optional sc | vt				   \
 	dependency	"$S/teken/gensequences $S/teken/sequences" \
 	compile-with	"${AWK} -f $S/teken/gensequences $S/teken/sequences > teken_state.h" \
 	no-obj no-implicit-rule before-depend				   \
 	clean		"teken_state.h"
 ukbdmap.h			optional	ukbd_dflt_keymap	\
 	compile-with	"${KEYMAP} -L ${UKBD_DFLT_KEYMAP} | ${KEYMAP_FIX} > ${.TARGET}" \
 	no-obj no-implicit-rule before-depend				\
 	clean		"ukbdmap.h"
 usbdevs.h			optional usb | hid			   \
 	dependency	"$S/tools/usbdevs2h.awk $S/dev/usb/usbdevs" \
 	compile-with	"${AWK} -f $S/tools/usbdevs2h.awk $S/dev/usb/usbdevs -h" \
 	no-obj no-implicit-rule before-depend				   \
 	clean		"usbdevs.h"
 usbdevs_data.h			optional usb				   \
 	dependency	"$S/tools/usbdevs2h.awk $S/dev/usb/usbdevs" \
 	compile-with	"${AWK} -f $S/tools/usbdevs2h.awk $S/dev/usb/usbdevs -d" \
 	no-obj no-implicit-rule before-depend				   \
 	clean		"usbdevs_data.h"
 sdiodevs.h			optional mmccam				   \
 	dependency	"$S/tools/sdiodevs2h.awk $S/dev/sdio/sdiodevs" \
 	compile-with	"${AWK} -f $S/tools/sdiodevs2h.awk $S/dev/sdio/sdiodevs -h" \
 	no-obj no-implicit-rule before-depend				   \
 	clean		"sdiodevs.h"
 sdiodevs_data.h			optional mmccam				   \
 	dependency	"$S/tools/sdiodevs2h.awk $S/dev/sdio/sdiodevs" \
 	compile-with	"${AWK} -f $S/tools/sdiodevs2h.awk $S/dev/sdio/sdiodevs -d" \
 	no-obj no-implicit-rule before-depend				   \
 	clean		"sdiodevs_data.h"
 cam/cam.c			optional scbus
 cam/cam_compat.c		optional scbus
 cam/cam_iosched.c		optional scbus
 cam/cam_periph.c		optional scbus
 cam/cam_queue.c			optional scbus
 cam/cam_sim.c			optional scbus
 cam/cam_xpt.c			optional scbus
 cam/ata/ata_all.c		optional scbus
 cam/ata/ata_xpt.c		optional scbus
 cam/ata/ata_pmp.c		optional scbus
 cam/nvme/nvme_all.c		optional scbus
 cam/nvme/nvme_da.c		optional nda | da
 cam/nvme/nvme_xpt.c		optional scbus
 cam/scsi/scsi_xpt.c		optional scbus
 cam/scsi/scsi_all.c		optional scbus
 cam/scsi/scsi_cd.c		optional cd
 cam/scsi/scsi_ch.c		optional ch
 cam/ata/ata_da.c		optional ada | da
 cam/ctl/ctl.c			optional ctl
 cam/ctl/ctl_backend.c		optional ctl
 cam/ctl/ctl_backend_block.c	optional ctl
 cam/ctl/ctl_backend_ramdisk.c	optional ctl
 cam/ctl/ctl_cmd_table.c		optional ctl
 cam/ctl/ctl_frontend.c		optional ctl
 cam/ctl/ctl_frontend_cam_sim.c	optional ctl
 cam/ctl/ctl_frontend_ioctl.c	optional ctl
 cam/ctl/ctl_frontend_iscsi.c	optional ctl cfiscsi
 cam/ctl/ctl_ha.c		optional ctl
 cam/ctl/ctl_scsi_all.c		optional ctl
 cam/ctl/ctl_tpc.c		optional ctl
 cam/ctl/ctl_tpc_local.c		optional ctl
 cam/ctl/ctl_error.c		optional ctl
 cam/ctl/ctl_util.c		optional ctl
 cam/ctl/scsi_ctl.c		optional ctl
 cam/mmc/mmc_xpt.c		optional scbus mmccam
 cam/mmc/mmc_sim.c		optional scbus mmccam
 cam/mmc/mmc_sim_if.m		optional scbus mmccam
 cam/mmc/mmc_da.c		optional scbus mmccam da
 cam/scsi/scsi_da.c		optional da
 cam/scsi/scsi_pass.c		optional pass
 cam/scsi/scsi_pt.c		optional pt
 cam/scsi/scsi_sa.c		optional sa
 cam/scsi/scsi_enc.c		optional ses
 cam/scsi/scsi_enc_ses.c		optional ses
 cam/scsi/scsi_enc_safte.c	optional ses
 cam/scsi/scsi_sg.c		optional sg
 cam/scsi/scsi_targ_bh.c		optional targbh
 cam/scsi/scsi_target.c		optional targ
 cam/scsi/smp_all.c		optional scbus
 
 # shared between zfs and dtrace
 cddl/compat/opensolaris/kern/opensolaris.c		optional dtrace compile-with "${CDDL_C}"
 cddl/compat/opensolaris/kern/opensolaris_proc.c		optional zfs | dtrace compile-with "${CDDL_C}"
 contrib/openzfs/module/os/freebsd/spl/spl_misc.c		optional zfs | dtrace compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/spl/spl_cmn_err.c		optional zfs | dtrace compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/spl/spl_taskq.c		optional zfs | dtrace compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/spl/spl_kmem.c		optional zfs | dtrace compile-with "${ZFS_C}"
 
 #zfs solaris portability layer
 contrib/openzfs/module/os/freebsd/spl/acl_common.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/spl/callb.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/spl/list.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/spl/spl_acl.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/spl/spl_dtrace.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/spl/spl_kstat.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/spl/spl_policy.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/spl/spl_procfs_list.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/spl/spl_string.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/spl/spl_sunddi.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/spl/spl_sysevent.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/spl/spl_uio.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/spl/spl_vfs.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/spl/spl_vm.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/spl/spl_zlib.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/spl/spl_zone.c		optional zfs compile-with "${ZFS_C}"
 
 
 
 # zfs specific
 
 #zfs avl
 contrib/openzfs/module/avl/avl.c				optional zfs compile-with "${ZFS_C}"
 
 # zfs lua support
 contrib/openzfs/module/lua/lapi.c			optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/lauxlib.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/lbaselib.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/lcode.c			optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/lcompat.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/lcorolib.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/lctype.c			optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/ldebug.c			optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/ldo.c			optional zfs compile-with "${ZFS_C} ${NO_WINFINITE_RECURSION}"
 contrib/openzfs/module/lua/lfunc.c			optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/lgc.c			optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/llex.c			optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/lmem.c			optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/lobject.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/lopcodes.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/lparser.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/lstate.c			optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/lstring.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/lstrlib.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/ltable.c			optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/ltablib.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/ltm.c			optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/lvm.c			optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/lua/lzio.c			optional zfs compile-with "${ZFS_C}"
 
 # zfs nvpair support
 contrib/openzfs/module/nvpair/fnvpair.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/nvpair/nvpair.c		optional zfs compile-with "${ZFS_RPC_C} ${NO_WSTRINGOP_OVERREAD}"
 contrib/openzfs/module/nvpair/nvpair_alloc_fixed.c	optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/nvpair/nvpair_alloc_spl.c	optional zfs compile-with "${ZFS_C}"
 
 #zfs platform compatibility code
 contrib/openzfs/module/os/freebsd/zfs/abd_os.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/arc_os.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/crypto_os.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/dmu_os.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/event_os.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/hkdf.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/kmod_core.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/spa_os.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/sysctl_os.c		optional zfs compile-with "${ZFS_C}  -include $S/modules/zfs/zfs_config.h"
 contrib/openzfs/module/os/freebsd/zfs/vdev_file.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/vdev_label_os.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/vdev_geom.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/zfs_acl.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/zfs_ctldir.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/zfs_debug.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/zfs_dir.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/zfs_file_os.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/zfs_ioctl_compat.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/zfs_ioctl_os.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/zfs_racct.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/zfs_vfsops.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/zfs_znode.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/zio_crypt.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/os/freebsd/zfs/zvol_os.c		optional zfs compile-with "${ZFS_C}"
 
 #zfs unicode support
 contrib/openzfs/module/unicode/uconv.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/unicode/u8_textprep.c		optional zfs compile-with "${ZFS_C}"
 
 #zfs checksums / zcommon
 contrib/openzfs/module/zcommon/cityhash.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zcommon/zfeature_common.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zcommon/zfs_comutil.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zcommon/zfs_deleg.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zcommon/zfs_fletcher.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zcommon/zfs_fletcher_superscalar.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zcommon/zfs_fletcher_superscalar4.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zcommon/zfs_namecheck.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zcommon/zfs_prop.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zcommon/zpool_prop.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zcommon/zprop_common.c		optional zfs compile-with "${ZFS_C}"
 
 # zfs edon-r hash support
 contrib/openzfs/module/icp/algs/edonr/edonr.c		optional zfs compile-with "${ZFS_C}"
 
 # zfs blake3 hash support
 contrib/openzfs/module/icp/algs/blake3/blake3.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/icp/algs/blake3/blake3_generic.c	optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/icp/algs/blake3/blake3_impl.c	optional zfs compile-with "${ZFS_C}"
 
 # zfs sha2 hash support
 contrib/openzfs/module/icp/algs/sha2/sha2_generic.c	optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/icp/algs/sha2/sha256_impl.c	optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/icp/algs/sha2/sha512_impl.c	optional zfs compile-with "${ZFS_C}"
 
 #zfs core common code
 contrib/openzfs/module/zfs/abd.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/aggsum.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/arc.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/blake3_zfs.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/blkptr.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/bplist.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/bpobj.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/bptree.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/brt.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/btree.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/bqueue.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dbuf.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dbuf_stats.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dataset_kstats.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/ddt.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/ddt_stats.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/ddt_zap.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dmu.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dmu_diff.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dmu_object.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dmu_objset.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dmu_recv.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dmu_redact.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dmu_send.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dmu_traverse.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dmu_tx.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dmu_zfetch.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dnode.c		optional zfs compile-with "${ZFS_C} ${NO_WUNUSED_BUT_SET_VARIABLE}" \
 	warning "kernel contains CDDL licensed ZFS filesystem"
 contrib/openzfs/module/zfs/dnode_sync.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dsl_bookmark.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dsl_crypt.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dsl_dataset.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dsl_deadlist.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dsl_deleg.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dsl_destroy.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dsl_dir.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dsl_pool.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dsl_prop.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dsl_scan.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dsl_synctask.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/dsl_userhold.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/edonr_zfs.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/fm.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/gzip.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/lzjb.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/lz4.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/lz4_zfs.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/metaslab.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/mmp.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/multilist.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/objlist.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/pathname.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/range_tree.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/refcount.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/rrwlock.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/sa.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/sha2_zfs.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/skein_zfs.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/spa.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/spa_checkpoint.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/spa_config.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/spa_errlog.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/spa_history.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/spa_log_spacemap.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/spa_misc.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/spa_stats.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/space_map.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/space_reftree.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/txg.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/uberblock.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/unique.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/vdev.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/vdev_draid.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/vdev_draid_rand.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/vdev_indirect.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/vdev_indirect_births.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/vdev_indirect_mapping.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/vdev_initialize.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/vdev_label.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/vdev_mirror.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/vdev_missing.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/vdev_queue.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/vdev_raidz.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/vdev_raidz_math.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/vdev_raidz_math_scalar.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/vdev_rebuild.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/vdev_removal.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/vdev_root.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/vdev_trim.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zap.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zap_leaf.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zap_micro.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zcp.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zcp_get.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zcp_global.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zcp_iter.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zcp_set.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zcp_synctask.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zfeature.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zfs_byteswap.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zfs_chksum.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zfs_fm.c		optional zfs compile-with "${ZFS_C} ${NO_WUNUSED_BUT_SET_VARIABLE}"
 contrib/openzfs/module/zfs/zfs_fuid.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zfs_impl.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zfs_ioctl.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zfs_log.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zfs_onexit.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zfs_quota.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zfs_ratelimit.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zfs_replay.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zfs_rlock.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zfs_sa.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zfs_vnops.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zstd/zfs_zstd.c		optional zfs zstdio compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zil.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zio.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zio_checksum.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zio_compress.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zio_inject.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zle.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zrlock.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zthr.c		optional zfs compile-with "${ZFS_C}"
 contrib/openzfs/module/zfs/zvol.c		optional zfs compile-with "${ZFS_C}"
 
 # dtrace specific
 cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c	optional dtrace compile-with "${DTRACE_C}" \
 							warning "kernel contains CDDL licensed DTRACE"
 cddl/contrib/opensolaris/uts/common/dtrace/dtrace_xoroshiro128_plus.c	optional dtrace compile-with "${DTRACE_C}"
 cddl/dev/dtmalloc/dtmalloc.c		optional dtmalloc        | dtraceall compile-with "${CDDL_C}"
 cddl/dev/profile/profile.c		optional dtrace_profile  | dtraceall compile-with "${CDDL_C}"
 cddl/dev/sdt/sdt.c			optional dtrace_sdt      | dtraceall compile-with "${CDDL_C}"
 cddl/dev/fbt/fbt.c			optional dtrace_fbt      | dtraceall compile-with "${FBT_C}"
 cddl/dev/systrace/systrace.c		optional dtrace_systrace | dtraceall compile-with "${CDDL_C}"
 cddl/dev/prototype.c			optional dtrace_prototype | dtraceall compile-with "${CDDL_C}"
 fs/nfsclient/nfs_clkdtrace.c		optional dtnfscl nfscl   | dtraceall nfscl compile-with "${CDDL_C}"
 compat/freebsd32/freebsd32_abort2.c	optional compat_freebsd32
 compat/freebsd32/freebsd32_capability.c	optional compat_freebsd32
 compat/freebsd32/freebsd32_ioctl.c	optional compat_freebsd32
 compat/freebsd32/freebsd32_misc.c	optional compat_freebsd32
 compat/freebsd32/freebsd32_syscalls.c	optional compat_freebsd32
 compat/freebsd32/freebsd32_sysent.c	optional compat_freebsd32
 contrib/ck/src/ck_array.c				standard compile-with "${NORMAL_C} -I$S/contrib/ck/include"
 contrib/ck/src/ck_barrier_centralized.c			standard compile-with "${NORMAL_C} -I$S/contrib/ck/include"
 contrib/ck/src/ck_barrier_combining.c			standard compile-with "${NORMAL_C} -I$S/contrib/ck/include"
 contrib/ck/src/ck_barrier_dissemination.c		standard compile-with "${NORMAL_C} -I$S/contrib/ck/include"
 contrib/ck/src/ck_barrier_mcs.c				standard compile-with "${NORMAL_C} -I$S/contrib/ck/include"
 contrib/ck/src/ck_barrier_tournament.c			standard compile-with "${NORMAL_C} -I$S/contrib/ck/include"
 contrib/ck/src/ck_epoch.c				standard compile-with "${NORMAL_C} -I$S/contrib/ck/include"
 contrib/ck/src/ck_hp.c					standard compile-with "${NORMAL_C} -I$S/contrib/ck/include"
 contrib/ck/src/ck_hs.c					standard compile-with "${NORMAL_C} -I$S/contrib/ck/include"
 contrib/ck/src/ck_ht.c					standard compile-with "${NORMAL_C} -I$S/contrib/ck/include"
 contrib/ck/src/ck_rhs.c					standard compile-with "${NORMAL_C} -I$S/contrib/ck/include"
 contrib/dev/acpica/common/ahids.c			optional acpi acpi_debug
 contrib/dev/acpica/common/ahuuids.c			optional acpi acpi_debug
 contrib/dev/acpica/components/debugger/dbcmds.c		optional acpi acpi_debug
 contrib/dev/acpica/components/debugger/dbconvert.c	optional acpi acpi_debug
 contrib/dev/acpica/components/debugger/dbdisply.c	optional acpi acpi_debug
 contrib/dev/acpica/components/debugger/dbexec.c		optional acpi acpi_debug
 contrib/dev/acpica/components/debugger/dbhistry.c	optional acpi acpi_debug
 contrib/dev/acpica/components/debugger/dbinput.c	optional acpi acpi_debug
 contrib/dev/acpica/components/debugger/dbmethod.c	optional acpi acpi_debug
 contrib/dev/acpica/components/debugger/dbnames.c	optional acpi acpi_debug
 contrib/dev/acpica/components/debugger/dbobject.c	optional acpi acpi_debug
 contrib/dev/acpica/components/debugger/dbstats.c	optional acpi acpi_debug
 contrib/dev/acpica/components/debugger/dbtest.c		optional acpi acpi_debug
 contrib/dev/acpica/components/debugger/dbutils.c	optional acpi acpi_debug
 contrib/dev/acpica/components/debugger/dbxface.c	optional acpi acpi_debug
 contrib/dev/acpica/components/disassembler/dmbuffer.c	optional acpi acpi_debug
 contrib/dev/acpica/components/disassembler/dmcstyle.c	optional acpi acpi_debug
 contrib/dev/acpica/components/disassembler/dmdeferred.c	optional acpi acpi_debug
 contrib/dev/acpica/components/disassembler/dmnames.c	optional acpi acpi_debug
 contrib/dev/acpica/components/disassembler/dmopcode.c	optional acpi acpi_debug
 contrib/dev/acpica/components/disassembler/dmresrc.c	optional acpi acpi_debug
 contrib/dev/acpica/components/disassembler/dmresrcl.c	optional acpi acpi_debug
 contrib/dev/acpica/components/disassembler/dmresrcl2.c	optional acpi acpi_debug
 contrib/dev/acpica/components/disassembler/dmresrcs.c	optional acpi acpi_debug
 contrib/dev/acpica/components/disassembler/dmutils.c	optional acpi acpi_debug
 contrib/dev/acpica/components/disassembler/dmwalk.c	optional acpi acpi_debug
 contrib/dev/acpica/components/dispatcher/dsargs.c	optional acpi
 contrib/dev/acpica/components/dispatcher/dscontrol.c	optional acpi
 contrib/dev/acpica/components/dispatcher/dsdebug.c	optional acpi
 contrib/dev/acpica/components/dispatcher/dsfield.c	optional acpi
 contrib/dev/acpica/components/dispatcher/dsinit.c	optional acpi
 contrib/dev/acpica/components/dispatcher/dsmethod.c	optional acpi
 contrib/dev/acpica/components/dispatcher/dsmthdat.c	optional acpi
 contrib/dev/acpica/components/dispatcher/dsobject.c	optional acpi
 contrib/dev/acpica/components/dispatcher/dsopcode.c	optional acpi
 contrib/dev/acpica/components/dispatcher/dspkginit.c	optional acpi
 contrib/dev/acpica/components/dispatcher/dsutils.c	optional acpi
 contrib/dev/acpica/components/dispatcher/dswexec.c	optional acpi
 contrib/dev/acpica/components/dispatcher/dswload.c	optional acpi
 contrib/dev/acpica/components/dispatcher/dswload2.c	optional acpi
 contrib/dev/acpica/components/dispatcher/dswscope.c	optional acpi
 contrib/dev/acpica/components/dispatcher/dswstate.c	optional acpi
 contrib/dev/acpica/components/events/evevent.c		optional acpi
 contrib/dev/acpica/components/events/evglock.c		optional acpi
 contrib/dev/acpica/components/events/evgpe.c		optional acpi
 contrib/dev/acpica/components/events/evgpeblk.c		optional acpi
 contrib/dev/acpica/components/events/evgpeinit.c	optional acpi
 contrib/dev/acpica/components/events/evgpeutil.c	optional acpi
 contrib/dev/acpica/components/events/evhandler.c	optional acpi
 contrib/dev/acpica/components/events/evmisc.c		optional acpi
 contrib/dev/acpica/components/events/evregion.c		optional acpi
 contrib/dev/acpica/components/events/evrgnini.c		optional acpi
 contrib/dev/acpica/components/events/evsci.c		optional acpi
 contrib/dev/acpica/components/events/evxface.c		optional acpi
 contrib/dev/acpica/components/events/evxfevnt.c		optional acpi
 contrib/dev/acpica/components/events/evxfgpe.c		optional acpi
 contrib/dev/acpica/components/events/evxfregn.c		optional acpi
 contrib/dev/acpica/components/executer/exconcat.c	optional acpi
 contrib/dev/acpica/components/executer/exconfig.c	optional acpi
 contrib/dev/acpica/components/executer/exconvrt.c	optional acpi
 contrib/dev/acpica/components/executer/excreate.c	optional acpi
 contrib/dev/acpica/components/executer/exdebug.c	optional acpi
 contrib/dev/acpica/components/executer/exdump.c		optional acpi
 contrib/dev/acpica/components/executer/exfield.c	optional acpi
 contrib/dev/acpica/components/executer/exfldio.c	optional acpi
 contrib/dev/acpica/components/executer/exmisc.c		optional acpi
 contrib/dev/acpica/components/executer/exmutex.c	optional acpi
 contrib/dev/acpica/components/executer/exnames.c	optional acpi
 contrib/dev/acpica/components/executer/exoparg1.c	optional acpi
 contrib/dev/acpica/components/executer/exoparg2.c	optional acpi
 contrib/dev/acpica/components/executer/exoparg3.c	optional acpi
 contrib/dev/acpica/components/executer/exoparg6.c	optional acpi
 contrib/dev/acpica/components/executer/exprep.c		optional acpi
 contrib/dev/acpica/components/executer/exregion.c	optional acpi
 contrib/dev/acpica/components/executer/exresnte.c	optional acpi
 contrib/dev/acpica/components/executer/exresolv.c	optional acpi
 contrib/dev/acpica/components/executer/exresop.c	optional acpi
 contrib/dev/acpica/components/executer/exserial.c	optional acpi
 contrib/dev/acpica/components/executer/exstore.c	optional acpi
 contrib/dev/acpica/components/executer/exstoren.c	optional acpi
 contrib/dev/acpica/components/executer/exstorob.c	optional acpi
 contrib/dev/acpica/components/executer/exsystem.c	optional acpi
 contrib/dev/acpica/components/executer/extrace.c	optional acpi
 contrib/dev/acpica/components/executer/exutils.c	optional acpi
 contrib/dev/acpica/components/hardware/hwacpi.c		optional acpi
 contrib/dev/acpica/components/hardware/hwesleep.c	optional acpi
 contrib/dev/acpica/components/hardware/hwgpe.c		optional acpi
 contrib/dev/acpica/components/hardware/hwpci.c		optional acpi
 contrib/dev/acpica/components/hardware/hwregs.c		optional acpi
 contrib/dev/acpica/components/hardware/hwsleep.c	optional acpi
 contrib/dev/acpica/components/hardware/hwtimer.c	optional acpi
 contrib/dev/acpica/components/hardware/hwvalid.c	optional acpi
 contrib/dev/acpica/components/hardware/hwxface.c	optional acpi
 contrib/dev/acpica/components/hardware/hwxfsleep.c	optional acpi
 contrib/dev/acpica/components/namespace/nsaccess.c	optional acpi \
 	compile-with "${NORMAL_C} ${NO_WUNUSED_BUT_SET_VARIABLE}"
 contrib/dev/acpica/components/namespace/nsalloc.c	optional acpi
 contrib/dev/acpica/components/namespace/nsarguments.c	optional acpi
 contrib/dev/acpica/components/namespace/nsconvert.c	optional acpi
 contrib/dev/acpica/components/namespace/nsdump.c	optional acpi
 contrib/dev/acpica/components/namespace/nseval.c	optional acpi
 contrib/dev/acpica/components/namespace/nsinit.c	optional acpi
 contrib/dev/acpica/components/namespace/nsload.c	optional acpi
 contrib/dev/acpica/components/namespace/nsnames.c	optional acpi
 contrib/dev/acpica/components/namespace/nsobject.c	optional acpi
 contrib/dev/acpica/components/namespace/nsparse.c	optional acpi
 contrib/dev/acpica/components/namespace/nspredef.c	optional acpi
 contrib/dev/acpica/components/namespace/nsprepkg.c	optional acpi
 contrib/dev/acpica/components/namespace/nsrepair.c	optional acpi
 contrib/dev/acpica/components/namespace/nsrepair2.c	optional acpi
 contrib/dev/acpica/components/namespace/nssearch.c	optional acpi
 contrib/dev/acpica/components/namespace/nsutils.c	optional acpi
 contrib/dev/acpica/components/namespace/nswalk.c	optional acpi
 contrib/dev/acpica/components/namespace/nsxfeval.c	optional acpi
 contrib/dev/acpica/components/namespace/nsxfname.c	optional acpi
 contrib/dev/acpica/components/namespace/nsxfobj.c	optional acpi
 contrib/dev/acpica/components/parser/psargs.c		optional acpi
 contrib/dev/acpica/components/parser/psloop.c		optional acpi
 contrib/dev/acpica/components/parser/psobject.c		optional acpi
 contrib/dev/acpica/components/parser/psopcode.c		optional acpi
 contrib/dev/acpica/components/parser/psopinfo.c		optional acpi
 contrib/dev/acpica/components/parser/psparse.c		optional acpi
 contrib/dev/acpica/components/parser/psscope.c		optional acpi
 contrib/dev/acpica/components/parser/pstree.c		optional acpi
 contrib/dev/acpica/components/parser/psutils.c		optional acpi
 contrib/dev/acpica/components/parser/pswalk.c		optional acpi
 contrib/dev/acpica/components/parser/psxface.c		optional acpi
 contrib/dev/acpica/components/resources/rsaddr.c	optional acpi
 contrib/dev/acpica/components/resources/rscalc.c	optional acpi
 contrib/dev/acpica/components/resources/rscreate.c	optional acpi
 contrib/dev/acpica/components/resources/rsdump.c	optional acpi acpi_debug
 contrib/dev/acpica/components/resources/rsdumpinfo.c	optional acpi
 contrib/dev/acpica/components/resources/rsinfo.c	optional acpi
 contrib/dev/acpica/components/resources/rsio.c		optional acpi
 contrib/dev/acpica/components/resources/rsirq.c		optional acpi
 contrib/dev/acpica/components/resources/rslist.c	optional acpi
 contrib/dev/acpica/components/resources/rsmemory.c	optional acpi
 contrib/dev/acpica/components/resources/rsmisc.c	optional acpi
 contrib/dev/acpica/components/resources/rsserial.c	optional acpi
 contrib/dev/acpica/components/resources/rsutils.c	optional acpi
 contrib/dev/acpica/components/resources/rsxface.c	optional acpi
 contrib/dev/acpica/components/tables/tbdata.c		optional acpi
 contrib/dev/acpica/components/tables/tbfadt.c		optional acpi
 contrib/dev/acpica/components/tables/tbfind.c		optional acpi
 contrib/dev/acpica/components/tables/tbinstal.c		optional acpi
 contrib/dev/acpica/components/tables/tbprint.c		optional acpi
 contrib/dev/acpica/components/tables/tbutils.c		optional acpi
 contrib/dev/acpica/components/tables/tbxface.c		optional acpi
 contrib/dev/acpica/components/tables/tbxfload.c		optional acpi
 contrib/dev/acpica/components/tables/tbxfroot.c		optional acpi
 contrib/dev/acpica/components/utilities/utaddress.c	optional acpi
 contrib/dev/acpica/components/utilities/utalloc.c	optional acpi
 contrib/dev/acpica/components/utilities/utascii.c	optional acpi
 contrib/dev/acpica/components/utilities/utbuffer.c	optional acpi
 contrib/dev/acpica/components/utilities/utcache.c	optional acpi
 contrib/dev/acpica/components/utilities/utcksum.c	optional acpi
 contrib/dev/acpica/components/utilities/utcopy.c	optional acpi
 contrib/dev/acpica/components/utilities/utdebug.c	optional acpi
 contrib/dev/acpica/components/utilities/utdecode.c	optional acpi
 contrib/dev/acpica/components/utilities/utdelete.c	optional acpi
 contrib/dev/acpica/components/utilities/uterror.c	optional acpi
 contrib/dev/acpica/components/utilities/uteval.c	optional acpi
 contrib/dev/acpica/components/utilities/utexcep.c	optional acpi
 contrib/dev/acpica/components/utilities/utglobal.c	optional acpi
 contrib/dev/acpica/components/utilities/uthex.c		optional acpi
 contrib/dev/acpica/components/utilities/utids.c		optional acpi
 contrib/dev/acpica/components/utilities/utinit.c	optional acpi
 contrib/dev/acpica/components/utilities/utlock.c	optional acpi
 contrib/dev/acpica/components/utilities/utmath.c	optional acpi
 contrib/dev/acpica/components/utilities/utmisc.c	optional acpi
 contrib/dev/acpica/components/utilities/utmutex.c	optional acpi
 contrib/dev/acpica/components/utilities/utnonansi.c	optional acpi
 contrib/dev/acpica/components/utilities/utobject.c	optional acpi
 contrib/dev/acpica/components/utilities/utosi.c		optional acpi
 contrib/dev/acpica/components/utilities/utownerid.c	optional acpi
 contrib/dev/acpica/components/utilities/utpredef.c	optional acpi
 contrib/dev/acpica/components/utilities/utresdecode.c	optional acpi acpi_debug
 contrib/dev/acpica/components/utilities/utresrc.c	optional acpi
 contrib/dev/acpica/components/utilities/utstate.c	optional acpi
 contrib/dev/acpica/components/utilities/utstring.c	optional acpi
 contrib/dev/acpica/components/utilities/utstrsuppt.c	optional acpi
 contrib/dev/acpica/components/utilities/utstrtoul64.c	optional acpi
 contrib/dev/acpica/components/utilities/utuuid.c	optional acpi acpi_debug
 contrib/dev/acpica/components/utilities/utxface.c	optional acpi
 contrib/dev/acpica/components/utilities/utxferror.c	optional acpi
 contrib/dev/acpica/components/utilities/utxfinit.c	optional acpi
 contrib/dev/acpica/os_specific/service_layers/osgendbg.c	optional acpi acpi_debug
 netpfil/ipfilter/netinet/fil.c	optional ipfilter inet \
 	compile-with "${NORMAL_C} ${NO_WSELF_ASSIGN} -Wno-unused -I$S/netpfil/ipfilter"
 netpfil/ipfilter/netinet/ip_auth.c optional ipfilter inet \
 	compile-with "${NORMAL_C} -Wno-unused -I$S/netpfil/ipfilter"
 netpfil/ipfilter/netinet/ip_fil_freebsd.c optional ipfilter inet \
 	compile-with "${NORMAL_C} -Wno-unused -I$S/netpfil/ipfilter"
 netpfil/ipfilter/netinet/ip_frag.c optional ipfilter inet \
 	compile-with "${NORMAL_C} -Wno-unused -I$S/netpfil/ipfilter"
 netpfil/ipfilter/netinet/ip_log.c optional ipfilter inet \
 	compile-with "${NORMAL_C} -I$S/netpfil/ipfilter"
 netpfil/ipfilter/netinet/ip_nat.c optional ipfilter inet \
 	compile-with "${NORMAL_C} -Wno-unused -I$S/netpfil/ipfilter"
 netpfil/ipfilter/netinet/ip_proxy.c optional ipfilter inet \
 	compile-with "${NORMAL_C} ${NO_WSELF_ASSIGN} -Wno-unused -I$S/netpfil/ipfilter"
 netpfil/ipfilter/netinet/ip_state.c optional ipfilter inet \
 	compile-with "${NORMAL_C} -Wno-unused -I$S/netpfil/ipfilter"
 netpfil/ipfilter/netinet/ip_lookup.c optional ipfilter inet \
 	compile-with "${NORMAL_C} ${NO_WSELF_ASSIGN} -Wno-unused -Wno-error -I$S/netpfil/ipfilter"
 netpfil/ipfilter/netinet/ip_pool.c optional ipfilter inet \
 	compile-with "${NORMAL_C} -Wno-unused -I$S/netpfil/ipfilter"
 netpfil/ipfilter/netinet/ip_htable.c optional ipfilter inet \
 	compile-with "${NORMAL_C} -Wno-unused -I$S/netpfil/ipfilter ${NO_WTAUTOLOGICAL_POINTER_COMPARE}"
 netpfil/ipfilter/netinet/ip_sync.c optional ipfilter inet \
 	compile-with "${NORMAL_C} -Wno-unused -I$S/netpfil/ipfilter"
 netpfil/ipfilter/netinet/mlfk_ipl.c optional ipfilter inet \
 	compile-with "${NORMAL_C} -I$S/netpfil/ipfilter"
 netpfil/ipfilter/netinet/ip_nat6.c optional ipfilter inet \
 	compile-with "${NORMAL_C} -Wno-unused -I$S/netpfil/ipfilter"
 netpfil/ipfilter/netinet/ip_rules.c optional ipfilter inet \
 	compile-with "${NORMAL_C} -I$S/netpfil/ipfilter"
 netpfil/ipfilter/netinet/ip_scan.c optional ipfilter inet \
 	compile-with "${NORMAL_C} -Wno-unused -I$S/netpfil/ipfilter"
 netpfil/ipfilter/netinet/ip_dstlist.c optional ipfilter inet \
 	compile-with "${NORMAL_C} -Wno-unused -I$S/netpfil/ipfilter"
 netpfil/ipfilter/netinet/radix_ipf.c optional ipfilter inet \
 	compile-with "${NORMAL_C} -I$S/netpfil/ipfilter"
 contrib/libfdt/fdt.c		optional fdt
 contrib/libfdt/fdt_ro.c		optional fdt
 contrib/libfdt/fdt_rw.c		optional fdt
 contrib/libfdt/fdt_strerror.c	optional fdt
 contrib/libfdt/fdt_sw.c		optional fdt
 contrib/libfdt/fdt_wip.c	optional fdt
 contrib/libnv/cnvlist.c		standard
 contrib/libnv/dnvlist.c		standard
 contrib/libnv/nvlist.c		standard
 contrib/libnv/bsd_nvpair.c		standard
 # xz
 dev/xz/xz_mod.c	optional xz \
 	compile-with "${NORMAL_C} -DXZ_USE_CRC64 -I$S/contrib/xz-embedded/freebsd/ -I$S/contrib/xz-embedded/linux/lib/xz/ -I$S/contrib/xz-embedded/linux/include/linux/"
 contrib/xz-embedded/linux/lib/xz/xz_crc32.c	optional xz \
 	compile-with "${NORMAL_C} -DXZ_USE_CRC64 -I$S/contrib/xz-embedded/freebsd/ -I$S/contrib/xz-embedded/linux/lib/xz/ -I$S/contrib/xz-embedded/linux/include/linux/"
 contrib/xz-embedded/linux/lib/xz/xz_crc64.c	optional xz \
 	compile-with "${NORMAL_C} -DXZ_USE_CRC64 -I$S/contrib/xz-embedded/freebsd/ -I$S/contrib/xz-embedded/linux/lib/xz/ -I$S/contrib/xz-embedded/linux/include/linux/"
 contrib/xz-embedded/linux/lib/xz/xz_dec_bcj.c	optional xz \
 	compile-with "${NORMAL_C} -DXZ_USE_CRC64 -I$S/contrib/xz-embedded/freebsd/ -I$S/contrib/xz-embedded/linux/lib/xz/ -I$S/contrib/xz-embedded/linux/include/linux/"
 contrib/xz-embedded/linux/lib/xz/xz_dec_lzma2.c	optional xz \
 	compile-with "${NORMAL_C} -DXZ_USE_CRC64 -I$S/contrib/xz-embedded/freebsd/ -I$S/contrib/xz-embedded/linux/lib/xz/ -I$S/contrib/xz-embedded/linux/include/linux/"
 contrib/xz-embedded/linux/lib/xz/xz_dec_stream.c optional xz \
 	compile-with "${NORMAL_C} -DXZ_USE_CRC64 -I$S/contrib/xz-embedded/freebsd/ -I$S/contrib/xz-embedded/linux/lib/xz/ -I$S/contrib/xz-embedded/linux/include/linux/"
 # Zstd
 contrib/zstd/lib/freebsd/zstd_kmalloc.c		optional zstdio compile-with ${ZSTD_C}
 contrib/zstd/lib/common/zstd_common.c		optional zstdio compile-with ${ZSTD_C}
 contrib/zstd/lib/common/fse_decompress.c	optional zstdio compile-with ${ZSTD_C}
 contrib/zstd/lib/common/entropy_common.c	optional zstdio compile-with ${ZSTD_C}
 contrib/zstd/lib/common/error_private.c		optional zstdio compile-with ${ZSTD_C}
 contrib/zstd/lib/common/xxhash.c		optional zstdio compile-with ${ZSTD_C}
 contrib/zstd/lib/compress/zstd_compress.c	optional zstdio compile-with ${ZSTD_C}
 contrib/zstd/lib/compress/zstd_compress_literals.c	optional zstdio compile-with ${ZSTD_C}
 contrib/zstd/lib/compress/zstd_compress_sequences.c	optional zstdio compile-with ${ZSTD_C}
 contrib/zstd/lib/compress/zstd_compress_superblock.c	optional zstdio compile-with "${ZSTD_C} ${NO_WUNUSED_BUT_SET_VARIABLE}"
 contrib/zstd/lib/compress/fse_compress.c	optional zstdio compile-with ${ZSTD_C}
 contrib/zstd/lib/compress/hist.c		optional zstdio compile-with ${ZSTD_C}
 contrib/zstd/lib/compress/huf_compress.c	optional zstdio compile-with ${ZSTD_C}
 contrib/zstd/lib/compress/zstd_double_fast.c	optional zstdio compile-with ${ZSTD_C}
 contrib/zstd/lib/compress/zstd_fast.c		optional zstdio compile-with ${ZSTD_C}
 contrib/zstd/lib/compress/zstd_lazy.c		optional zstdio compile-with ${ZSTD_C}
 contrib/zstd/lib/compress/zstd_ldm.c		optional zstdio compile-with ${ZSTD_C}
 contrib/zstd/lib/compress/zstd_opt.c		optional zstdio compile-with ${ZSTD_C}
 contrib/zstd/lib/decompress/zstd_ddict.c	optional zstdio compile-with ${ZSTD_C}
 contrib/zstd/lib/decompress/zstd_decompress.c	optional zstdio compile-with ${ZSTD_C}
 # See comment in sys/conf/kern.pre.mk
 contrib/zstd/lib/decompress/zstd_decompress_block.c	optional zstdio \
 	compile-with "${ZSTD_C} ${ZSTD_DECOMPRESS_BLOCK_FLAGS}"
 contrib/zstd/lib/decompress/huf_decompress.c	optional zstdio compile-with "${ZSTD_C} ${NO_WBITWISE_INSTEAD_OF_LOGICAL}"
 # Blake 2
 contrib/libb2/blake2b-ref.c	optional crypto | !random_loadable random_fenestrasx \
 	compile-with "${NORMAL_C} -I$S/crypto/blake2 -Wno-cast-qual -DSUFFIX=_ref -Wno-unused-function"
 contrib/libb2/blake2s-ref.c	optional crypto \
 	compile-with "${NORMAL_C} -I$S/crypto/blake2 -Wno-cast-qual -DSUFFIX=_ref -Wno-unused-function"
 crypto/blake2/blake2-sw.c	optional crypto \
 	compile-with "${NORMAL_C} -I$S/crypto/blake2 -Wno-cast-qual"
 crypto/camellia/camellia.c	optional crypto
 crypto/camellia/camellia-api.c	optional crypto
 crypto/chacha20/chacha.c	standard
 crypto/chacha20/chacha-sw.c	optional crypto
 crypto/chacha20_poly1305.c	optional crypto
 crypto/curve25519.c		optional crypto \
 	compile-with "${NORMAL_C} -I$S/contrib/libsodium/src/libsodium/include -I$S/crypto/libsodium"
 crypto/des/des_ecb.c		optional netsmb
 crypto/des/des_setkey.c		optional netsmb
 crypto/openssl/ossl.c		optional ossl
 crypto/openssl/ossl_aes.c	optional ossl
 crypto/openssl/ossl_chacha20.c	optional ossl
 crypto/openssl/ossl_poly1305.c	optional ossl
 crypto/openssl/ossl_sha1.c	optional ossl
 crypto/openssl/ossl_sha256.c	optional ossl
 crypto/openssl/ossl_sha512.c	optional ossl
 crypto/rc4/rc4.c		optional netgraph_mppc_encryption
 crypto/rijndael/rijndael-alg-fst.c optional crypto | ekcd | geom_bde | \
 	!random_loadable | wlan_ccmp
 crypto/rijndael/rijndael-api-fst.c optional ekcd | geom_bde | !random_loadable
 crypto/rijndael/rijndael-api.c	optional crypto | wlan_ccmp
 crypto/sha1.c			optional carp | crypto | ether | \
 	netgraph_mppc_encryption | sctp
 crypto/sha2/sha256c.c		optional crypto | ekcd | geom_bde | \
 	!random_loadable | sctp | zfs
 crypto/sha2/sha512c.c		optional crypto | geom_bde | zfs
 crypto/skein/skein.c		optional crypto | zfs
 crypto/skein/skein_block.c	optional crypto | zfs
 crypto/siphash/siphash.c	optional inet | inet6 | wg
 crypto/siphash/siphash_test.c	optional inet | inet6 | wg
 ddb/db_access.c			optional ddb
 ddb/db_break.c			optional ddb
 ddb/db_capture.c		optional ddb
 ddb/db_command.c		optional ddb
 ddb/db_ctf.c			optional ddb
 ddb/db_examine.c		optional ddb
 ddb/db_expr.c			optional ddb
 ddb/db_input.c			optional ddb
 ddb/db_lex.c			optional ddb
 ddb/db_main.c			optional ddb
 ddb/db_output.c			optional ddb
 ddb/db_pprint.c			optional ddb
 ddb/db_print.c			optional ddb
 ddb/db_ps.c			optional ddb
 ddb/db_run.c			optional ddb
 ddb/db_script.c			optional ddb
 ddb/db_sym.c			optional ddb
 ddb/db_thread.c			optional ddb
 ddb/db_textdump.c		optional ddb
 ddb/db_variables.c		optional ddb
 ddb/db_watch.c			optional ddb
 ddb/db_write_cmd.c		optional ddb
 dev/aac/aac.c			optional aac
 dev/aac/aac_cam.c		optional aacp aac
 dev/aac/aac_debug.c		optional aac
 dev/aac/aac_disk.c		optional aac
 dev/aac/aac_pci.c		optional aac pci
 dev/aacraid/aacraid.c		optional aacraid
 dev/aacraid/aacraid_cam.c	optional aacraid scbus
 dev/aacraid/aacraid_debug.c	optional aacraid
 dev/aacraid/aacraid_pci.c	optional aacraid pci
 dev/acpi_support/acpi_wmi.c	optional acpi_wmi acpi
 dev/acpi_support/acpi_asus.c	optional acpi_asus acpi
 dev/acpi_support/acpi_asus_wmi.c	optional acpi_asus_wmi acpi
 dev/acpi_support/acpi_fujitsu.c	optional acpi_fujitsu acpi
 dev/acpi_support/acpi_hp.c	optional acpi_hp acpi
 dev/acpi_support/acpi_ibm.c	optional acpi_ibm acpi
 dev/acpi_support/acpi_panasonic.c optional acpi_panasonic acpi
 dev/acpi_support/acpi_sony.c	optional acpi_sony acpi
 dev/acpi_support/acpi_toshiba.c	optional acpi_toshiba acpi
 dev/acpi_support/atk0110.c	optional aibs acpi
 dev/acpica/Osd/OsdDebug.c	optional acpi
 dev/acpica/Osd/OsdHardware.c	optional acpi
 dev/acpica/Osd/OsdInterrupt.c	optional acpi
 dev/acpica/Osd/OsdMemory.c	optional acpi
 dev/acpica/Osd/OsdSchedule.c	optional acpi
 dev/acpica/Osd/OsdStream.c	optional acpi
 dev/acpica/Osd/OsdSynch.c	optional acpi
 dev/acpica/Osd/OsdTable.c	optional acpi
 dev/acpica/acpi.c		optional acpi
 dev/acpica/acpi_acad.c		optional acpi
 dev/acpica/acpi_apei.c		optional acpi
 dev/acpica/acpi_battery.c	optional acpi
 dev/acpica/acpi_button.c	optional acpi
 dev/acpica/acpi_cmbat.c		optional acpi
 dev/acpica/acpi_cpu.c		optional acpi
 dev/acpica/acpi_ec.c		optional acpi
 dev/acpica/acpi_ged.c		optional acpi_ged acpi
 dev/acpica/acpi_isab.c		optional acpi isa
 dev/acpica/acpi_lid.c		optional acpi
 dev/acpica/acpi_package.c	optional acpi
 dev/acpica/acpi_perf.c		optional acpi
 dev/acpica/acpi_powerres.c	optional acpi
 dev/acpica/acpi_quirk.c		optional acpi
 dev/acpica/acpi_resource.c	optional acpi
 dev/acpica/acpi_container.c	optional acpi
 dev/acpica/acpi_smbat.c		optional acpi
 dev/acpica/acpi_thermal.c	optional acpi
 dev/acpica/acpi_throttle.c	optional acpi
 dev/acpica/acpi_video.c		optional acpi_video acpi
 dev/acpica/acpi_dock.c		optional acpi_dock acpi
 dev/adlink/adlink.c		optional adlink
 dev/ae/if_ae.c			optional ae pci
 dev/age/if_age.c		optional age pci
 dev/agp/agp.c			optional agp pci
 dev/agp/agp_if.m		optional agp pci
 dev/ahci/ahci.c			optional ahci
 dev/ahci/ahciem.c		optional ahci
 dev/ahci/ahci_pci.c		optional ahci pci
 dev/aic7xxx/ahc_isa.c		optional ahc isa
 dev/aic7xxx/ahc_pci.c		optional ahc pci \
 	compile-with "${NORMAL_C} ${NO_WCONSTANT_CONVERSION}"
 dev/aic7xxx/ahd_pci.c		optional ahd pci \
 	compile-with "${NORMAL_C} ${NO_WCONSTANT_CONVERSION}"
 dev/aic7xxx/aic7770.c		optional ahc
 dev/aic7xxx/aic79xx.c		optional ahd pci
 dev/aic7xxx/aic79xx_osm.c	optional ahd pci
 dev/aic7xxx/aic79xx_pci.c	optional ahd pci
 dev/aic7xxx/aic79xx_reg_print.c	optional ahd pci ahd_reg_pretty_print
 dev/aic7xxx/aic7xxx.c		optional ahc
 dev/aic7xxx/aic7xxx_93cx6.c	optional ahc
 dev/aic7xxx/aic7xxx_osm.c	optional ahc
 dev/aic7xxx/aic7xxx_pci.c	optional ahc pci
 dev/aic7xxx/aic7xxx_reg_print.c	optional ahc ahc_reg_pretty_print
 dev/al_eth/al_eth.c				optional al_eth	fdt	\
 	no-depend	\
 	compile-with "${CC} -c -o ${.TARGET} ${CFLAGS} -I$S/contrib/alpine-hal -I$S/contrib/alpine-hal/eth ${.IMPSRC}"
 dev/al_eth/al_init_eth_lm.c			optional al_eth	fdt	\
 	no-depend	\
 	compile-with "${CC} -c -o ${.TARGET} ${CFLAGS} -I$S/contrib/alpine-hal -I$S/contrib/alpine-hal/eth ${.IMPSRC}"
 dev/al_eth/al_init_eth_kr.c			optional al_eth	fdt	\
 	no-depend	\
 	compile-with "${CC} -c -o ${.TARGET} ${CFLAGS} -I$S/contrib/alpine-hal -I$S/contrib/alpine-hal/eth ${.IMPSRC}"
 contrib/alpine-hal/al_hal_iofic.c		optional al_iofic	\
 	no-depend	\
 	compile-with "${CC} -c -o ${.TARGET} ${CFLAGS} -I$S/contrib/alpine-hal -I$S/contrib/alpine-hal/eth ${.IMPSRC}"
 contrib/alpine-hal/al_hal_serdes_25g.c		optional al_serdes	\
 	no-depend	\
 	compile-with "${CC} -c -o ${.TARGET} ${CFLAGS} -I$S/contrib/alpine-hal -I$S/contrib/alpine-hal/eth ${.IMPSRC}"
 contrib/alpine-hal/al_hal_serdes_hssp.c		optional al_serdes	\
 	no-depend	\
 	compile-with "${CC} -c -o ${.TARGET} ${CFLAGS} -I$S/contrib/alpine-hal -I$S/contrib/alpine-hal/eth ${.IMPSRC}"
 contrib/alpine-hal/al_hal_udma_config.c		optional al_udma	\
 	no-depend	\
 	compile-with "${CC} -c -o ${.TARGET} ${CFLAGS} -I$S/contrib/alpine-hal -I$S/contrib/alpine-hal/eth ${.IMPSRC}"
 contrib/alpine-hal/al_hal_udma_debug.c		optional al_udma	\
 	no-depend	\
 	compile-with "${CC} -c -o ${.TARGET} ${CFLAGS} -I$S/contrib/alpine-hal -I$S/contrib/alpine-hal/eth ${.IMPSRC}"
 contrib/alpine-hal/al_hal_udma_iofic.c		optional al_udma	\
 	no-depend	\
 	compile-with "${CC} -c -o ${.TARGET} ${CFLAGS} -I$S/contrib/alpine-hal -I$S/contrib/alpine-hal/eth ${.IMPSRC}"
 contrib/alpine-hal/al_hal_udma_main.c		optional al_udma	\
 	no-depend	\
 	compile-with "${CC} -c -o ${.TARGET} ${CFLAGS} -I$S/contrib/alpine-hal -I$S/contrib/alpine-hal/eth ${.IMPSRC}"
 contrib/alpine-hal/al_serdes.c			optional al_serdes	\
 	no-depend	\
 	compile-with "${CC} -c -o ${.TARGET} ${CFLAGS} -I$S/contrib/alpine-hal -I$S/contrib/alpine-hal/eth ${.IMPSRC}"
 contrib/alpine-hal/eth/al_hal_eth_kr.c		optional al_eth		\
 	no-depend	\
 	compile-with "${CC} -c -o ${.TARGET} ${CFLAGS} -I$S/contrib/alpine-hal -I$S/contrib/alpine-hal/eth ${.IMPSRC}"
 contrib/alpine-hal/eth/al_hal_eth_main.c	optional al_eth		\
 	no-depend	\
 	compile-with "${CC} -c -o ${.TARGET} ${CFLAGS} -I$S/contrib/alpine-hal -I$S/contrib/alpine-hal/eth ${.IMPSRC}"
 dev/alc/if_alc.c		optional alc pci
 dev/ale/if_ale.c		optional ale pci
 dev/alpm/alpm.c			optional alpm pci
 dev/altera/avgen/altera_avgen.c		optional altera_avgen
 dev/altera/avgen/altera_avgen_fdt.c	optional altera_avgen fdt
 dev/altera/avgen/altera_avgen_nexus.c	optional altera_avgen
 dev/altera/msgdma/msgdma.c		optional altera_msgdma xdma
 dev/altera/sdcard/altera_sdcard.c	optional altera_sdcard
 dev/altera/sdcard/altera_sdcard_disk.c	optional altera_sdcard
 dev/altera/sdcard/altera_sdcard_io.c	optional altera_sdcard
 dev/altera/sdcard/altera_sdcard_fdt.c	optional altera_sdcard fdt
 dev/altera/sdcard/altera_sdcard_nexus.c	optional altera_sdcard
 dev/altera/softdma/softdma.c	optional altera_softdma xdma fdt
 dev/altera/pio/pio.c		optional altera_pio
 dev/altera/pio/pio_if.m		optional altera_pio
 dev/amdpm/amdpm.c		optional amdpm pci | nfpm pci
 dev/amdsmb/amdsmb.c		optional amdsmb pci
 #
 dev/ata/ata_if.m		optional ata | atacore
 dev/ata/ata-all.c		optional ata | atacore
 dev/ata/ata-dma.c		optional ata | atacore
 dev/ata/ata-lowlevel.c		optional ata | atacore
 dev/ata/ata-sata.c		optional ata | atacore
 dev/ata/ata-isa.c		optional ata isa | ataisa
 dev/ata/ata-pci.c		optional ata pci | atapci
 dev/ata/chipsets/ata-acard.c	optional ata pci | ataacard
 dev/ata/chipsets/ata-acerlabs.c	optional ata pci | ataacerlabs
 dev/ata/chipsets/ata-amd.c	optional ata pci | ataamd
 dev/ata/chipsets/ata-ati.c	optional ata pci | ataati
 dev/ata/chipsets/ata-cenatek.c	optional ata pci | atacenatek
 dev/ata/chipsets/ata-cypress.c	optional ata pci | atacypress
 dev/ata/chipsets/ata-cyrix.c	optional ata pci | atacyrix
 dev/ata/chipsets/ata-highpoint.c	optional ata pci | atahighpoint
 dev/ata/chipsets/ata-intel.c	optional ata pci | ataintel
 dev/ata/chipsets/ata-ite.c	optional ata pci | ataite
 dev/ata/chipsets/ata-jmicron.c	optional ata pci | atajmicron
 dev/ata/chipsets/ata-marvell.c	optional ata pci | atamarvell
 dev/ata/chipsets/ata-micron.c	optional ata pci | atamicron
 dev/ata/chipsets/ata-national.c	optional ata pci | atanational
 dev/ata/chipsets/ata-netcell.c	optional ata pci | atanetcell
 dev/ata/chipsets/ata-nvidia.c	optional ata pci | atanvidia
 dev/ata/chipsets/ata-promise.c	optional ata pci | atapromise
 dev/ata/chipsets/ata-serverworks.c	optional ata pci | ataserverworks
 dev/ata/chipsets/ata-siliconimage.c	optional ata pci | atasiliconimage | ataati
 dev/ata/chipsets/ata-sis.c	optional ata pci | atasis
 dev/ata/chipsets/ata-via.c	optional ata pci | atavia
 #
 dev/ath/if_ath.c		optional ath \
 	compile-with "${ATH_C}"
 dev/ath/if_ath_alq.c		optional ath \
 	compile-with "${ATH_C}"
 dev/ath/if_ath_beacon.c		optional ath \
 	compile-with "${ATH_C}"
 dev/ath/if_ath_btcoex.c		optional ath \
 	compile-with "${ATH_C}"
 dev/ath/if_ath_btcoex_mci.c	optional ath \
 	compile-with "${ATH_C}"
 dev/ath/if_ath_debug.c		optional ath \
 	compile-with "${ATH_C}"
 dev/ath/if_ath_descdma.c	optional ath \
 	compile-with "${ATH_C}"
 dev/ath/if_ath_keycache.c	optional ath \
 	compile-with "${ATH_C}"
 dev/ath/if_ath_ioctl.c		optional ath \
 	compile-with "${ATH_C}"
 dev/ath/if_ath_led.c		optional ath \
 	compile-with "${ATH_C}"
 dev/ath/if_ath_lna_div.c	optional ath \
 	compile-with "${ATH_C}"
 dev/ath/if_ath_pci.c		optional ath pci \
 	compile-with "${ATH_C}"
 dev/ath/if_ath_tx.c		optional ath \
 	compile-with "${ATH_C}"
 dev/ath/if_ath_tx_edma.c	optional ath \
 	compile-with "${ATH_C}"
 dev/ath/if_ath_tx_ht.c		optional ath \
 	compile-with "${ATH_C}"
 dev/ath/if_ath_tdma.c		optional ath \
 	compile-with "${ATH_C}"
 dev/ath/if_ath_sysctl.c		optional ath \
 	compile-with "${ATH_C}"
 dev/ath/if_ath_rx.c		optional ath \
 	compile-with "${ATH_C}"
 dev/ath/if_ath_rx_edma.c	optional ath \
 	compile-with "${ATH_C}"
 dev/ath/if_ath_spectral.c	optional ath \
 	compile-with "${ATH_C}"
 dev/ath/ah_osdep.c		optional ath \
 	compile-with "${ATH_C}"
 #
 dev/ath/ath_hal/ah.c		optional ath \
 	compile-with "${ATH_C}"
 dev/ath/ath_hal/ah_eeprom_v1.c	optional ath_hal | ath_ar5210 \
 	compile-with "${ATH_C}"
 dev/ath/ath_hal/ah_eeprom_v3.c	optional ath_hal | ath_ar5211 | ath_ar5212 \
 	compile-with "${ATH_C}"
 dev/ath/ath_hal/ah_eeprom_v14.c \
 	optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 \
 	compile-with "${ATH_C}"
 dev/ath/ath_hal/ah_eeprom_v4k.c \
 	optional ath_hal | ath_ar9285 \
 	compile-with "${ATH_C}"
 dev/ath/ath_hal/ah_eeprom_9287.c \
 	optional ath_hal | ath_ar9287 \
 	compile-with "${ATH_C}"
 dev/ath/ath_hal/ah_regdomain.c	optional ath \
 	compile-with "${ATH_C} ${NO_WSHIFT_COUNT_NEGATIVE} ${NO_WSHIFT_COUNT_OVERFLOW}"
 # ar5210
 dev/ath/ath_hal/ar5210/ar5210_attach.c		optional ath_hal | ath_ar5210 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5210/ar5210_beacon.c		optional ath_hal | ath_ar5210 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5210/ar5210_interrupts.c	optional ath_hal | ath_ar5210 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5210/ar5210_keycache.c	optional ath_hal | ath_ar5210 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5210/ar5210_misc.c		optional ath_hal | ath_ar5210 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5210/ar5210_phy.c		optional ath_hal | ath_ar5210 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5210/ar5210_power.c		optional ath_hal | ath_ar5210 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5210/ar5210_recv.c		optional ath_hal | ath_ar5210 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5210/ar5210_reset.c		optional ath_hal | ath_ar5210 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5210/ar5210_xmit.c		optional ath_hal | ath_ar5210 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 # ar5211
 dev/ath/ath_hal/ar5211/ar5211_attach.c		optional ath_hal | ath_ar5211 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5211/ar5211_beacon.c		optional ath_hal | ath_ar5211 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5211/ar5211_interrupts.c	optional ath_hal | ath_ar5211 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5211/ar5211_keycache.c	optional ath_hal | ath_ar5211 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5211/ar5211_misc.c		optional ath_hal | ath_ar5211 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5211/ar5211_phy.c		optional ath_hal | ath_ar5211 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5211/ar5211_power.c		optional ath_hal | ath_ar5211 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5211/ar5211_recv.c		optional ath_hal | ath_ar5211 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5211/ar5211_reset.c		optional ath_hal | ath_ar5211 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5211/ar5211_xmit.c		optional ath_hal | ath_ar5211 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 # ar5212
 dev/ath/ath_hal/ar5212/ar5212_ani.c \
 	optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \
 	ath_ar9285 ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5212/ar5212_attach.c \
 	optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \
 	ath_ar9285 ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5212/ar5212_beacon.c \
 	optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \
 	ath_ar9285 ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5212/ar5212_eeprom.c \
 	optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \
 	ath_ar9285 ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5212/ar5212_gpio.c \
 	optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \
 	ath_ar9285 ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5212/ar5212_interrupts.c \
 	optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \
 	ath_ar9285 ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5212/ar5212_keycache.c \
 	optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \
 	ath_ar9285 ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5212/ar5212_misc.c \
 	optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \
 	ath_ar9285 ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5212/ar5212_phy.c \
 	optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \
 	ath_ar9285 ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5212/ar5212_power.c \
 	optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \
 	ath_ar9285 ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5212/ar5212_recv.c \
 	optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \
 	ath_ar9285 ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5212/ar5212_reset.c \
 	optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \
 	ath_ar9285 ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5212/ar5212_rfgain.c \
 	optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \
 	ath_ar9285 ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5212/ar5212_xmit.c \
 	optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \
 	ath_ar9285 ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 # ar5416 (depends on ar5212)
 dev/ath/ath_hal/ar5416/ar5416_ani.c \
 	optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 | \
 	ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5416/ar5416_attach.c \
 	optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 | \
 	ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5416/ar5416_beacon.c \
 	optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 | \
 	ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5416/ar5416_btcoex.c \
 	optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 | \
 	ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5416/ar5416_cal.c \
 	optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 | \
 	ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5416/ar5416_cal_iq.c \
 	optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 | \
 	ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5416/ar5416_cal_adcgain.c \
 	optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 | \
 	ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5416/ar5416_cal_adcdc.c \
 	optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 | \
 	ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5416/ar5416_eeprom.c \
 	optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 | \
 	ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5416/ar5416_gpio.c \
 	optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 | \
 	ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5416/ar5416_interrupts.c \
 	optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 | \
 	ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5416/ar5416_keycache.c \
 	optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 | \
 	ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5416/ar5416_misc.c \
 	optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 | \
 	ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5416/ar5416_phy.c \
 	optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 | \
 	ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5416/ar5416_power.c \
 	optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 | \
 	ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5416/ar5416_radar.c \
 	optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 | \
 	ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5416/ar5416_recv.c \
 	optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 | \
 	ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5416/ar5416_reset.c \
 	optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 | \
 	ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5416/ar5416_spectral.c \
 	optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 | \
 	ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5416/ar5416_xmit.c \
 	optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 | \
 	ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 # ar9160 (depends on ar5416)
 dev/ath/ath_hal/ar9001/ar9160_attach.c optional ath_hal | ath_ar9160 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 # ar9280 (depends on ar5416)
 dev/ath/ath_hal/ar9002/ar9280_attach.c optional ath_hal | ath_ar9280 | \
 	ath_ar9285 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar9002/ar9280_olc.c optional ath_hal | ath_ar9280 | \
 	ath_ar9285 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 # ar9285 (depends on ar5416 and ar9280)
 dev/ath/ath_hal/ar9002/ar9285_attach.c optional ath_hal | ath_ar9285 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar9002/ar9285_btcoex.c optional ath_hal | ath_ar9285 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar9002/ar9285_reset.c optional ath_hal | ath_ar9285 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar9002/ar9285_cal.c optional ath_hal | ath_ar9285 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar9002/ar9285_phy.c optional ath_hal | ath_ar9285 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar9002/ar9285_diversity.c optional ath_hal | ath_ar9285 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 # ar9287 (depends on ar5416)
 dev/ath/ath_hal/ar9002/ar9287_attach.c optional ath_hal | ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar9002/ar9287_reset.c optional ath_hal | ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar9002/ar9287_cal.c optional ath_hal | ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar9002/ar9287_olc.c optional ath_hal | ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 
 # ar9300
 contrib/dev/ath/ath_hal/ar9300/ar9300_ani.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 contrib/dev/ath/ath_hal/ar9300/ar9300_attach.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 contrib/dev/ath/ath_hal/ar9300/ar9300_beacon.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 contrib/dev/ath/ath_hal/ar9300/ar9300_eeprom.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal ${NO_WCONSTANT_CONVERSION}"
 contrib/dev/ath/ath_hal/ar9300/ar9300_freebsd.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 contrib/dev/ath/ath_hal/ar9300/ar9300_gpio.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 contrib/dev/ath/ath_hal/ar9300/ar9300_interrupts.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 contrib/dev/ath/ath_hal/ar9300/ar9300_keycache.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 contrib/dev/ath/ath_hal/ar9300/ar9300_mci.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 contrib/dev/ath/ath_hal/ar9300/ar9300_misc.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 contrib/dev/ath/ath_hal/ar9300/ar9300_paprd.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 contrib/dev/ath/ath_hal/ar9300/ar9300_phy.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 contrib/dev/ath/ath_hal/ar9300/ar9300_power.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 contrib/dev/ath/ath_hal/ar9300/ar9300_radar.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 contrib/dev/ath/ath_hal/ar9300/ar9300_radio.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 contrib/dev/ath/ath_hal/ar9300/ar9300_recv.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 contrib/dev/ath/ath_hal/ar9300/ar9300_recv_ds.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 contrib/dev/ath/ath_hal/ar9300/ar9300_reset.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal ${NO_WSOMETIMES_UNINITIALIZED} -Wno-unused-function"
 contrib/dev/ath/ath_hal/ar9300/ar9300_stub.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 contrib/dev/ath/ath_hal/ar9300/ar9300_stub_funcs.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 contrib/dev/ath/ath_hal/ar9300/ar9300_spectral.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 contrib/dev/ath/ath_hal/ar9300/ar9300_timer.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 contrib/dev/ath/ath_hal/ar9300/ar9300_xmit.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 contrib/dev/ath/ath_hal/ar9300/ar9300_xmit_ds.c optional ath_hal | ath_ar9300 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal -I$S/contrib/dev/ath/ath_hal"
 
 # rf backends
 dev/ath/ath_hal/ar5212/ar2316.c	optional ath_rf2316 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5212/ar2317.c	optional ath_rf2317 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5212/ar2413.c	optional ath_hal | ath_rf2413 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5212/ar2425.c	optional ath_hal | ath_rf2425 | ath_rf2417 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5212/ar5111.c	optional ath_hal | ath_rf5111 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5212/ar5112.c	optional ath_hal | ath_rf5112 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5212/ar5413.c	optional ath_hal | ath_rf5413 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar5416/ar2133.c optional ath_hal | ath_ar5416 | \
 	ath_ar9130 | ath_ar9160 | ath_ar9280 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar9002/ar9280.c optional ath_hal | ath_ar9280 | ath_ar9285 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar9002/ar9285.c optional ath_hal | ath_ar9285 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 dev/ath/ath_hal/ar9002/ar9287.c optional ath_hal | ath_ar9287 \
 	compile-with "${ATH_C} -I$S/dev/ath/ath_hal"
 
 # ath rate control algorithms
 dev/ath/ath_rate/amrr/amrr.c	optional ath_rate_amrr \
 	compile-with "${ATH_C}"
 dev/ath/ath_rate/onoe/onoe.c	optional ath_rate_onoe \
 	compile-with "${ATH_C}"
 dev/ath/ath_rate/sample/sample.c	optional ath_rate_sample \
 	compile-with "${ATH_C}"
 # ath DFS modules
 dev/ath/ath_dfs/null/dfs_null.c	optional ath \
 	compile-with "${ATH_C}"
 #
 dev/backlight/backlight_if.m		optional backlight | compat_linuxkpi
 dev/backlight/backlight.c		optional backlight | compat_linuxkpi
 dev/bce/if_bce.c			optional bce
 dev/bfe/if_bfe.c			optional bfe
 dev/bge/if_bge.c			optional bge
 dev/bhnd/bhnd.c				optional bhnd
 dev/bhnd/bhnd_erom.c			optional bhnd
 dev/bhnd/bhnd_erom_if.m			optional bhnd
 dev/bhnd/bhnd_subr.c			optional bhnd
 dev/bhnd/bhnd_bus_if.m			optional bhnd
 dev/bhnd/bhndb/bhnd_bhndb.c		optional bhndb bhnd
 dev/bhnd/bhndb/bhndb.c			optional bhndb bhnd
 dev/bhnd/bhndb/bhndb_bus_if.m		optional bhndb bhnd
 dev/bhnd/bhndb/bhndb_hwdata.c		optional bhndb bhnd
 dev/bhnd/bhndb/bhndb_if.m		optional bhndb bhnd
 dev/bhnd/bhndb/bhndb_pci.c		optional bhndb_pci bhndb bhnd pci
 dev/bhnd/bhndb/bhndb_pci_hwdata.c 	optional bhndb_pci bhndb bhnd pci
 dev/bhnd/bhndb/bhndb_pci_sprom.c	optional bhndb_pci bhndb bhnd pci
 dev/bhnd/bhndb/bhndb_subr.c		optional bhndb bhnd
 dev/bhnd/bcma/bcma.c			optional bcma bhnd
 dev/bhnd/bcma/bcma_bhndb.c		optional bcma bhnd bhndb
 dev/bhnd/bcma/bcma_erom.c		optional bcma bhnd
 dev/bhnd/bcma/bcma_subr.c		optional bcma bhnd
 dev/bhnd/cores/chipc/bhnd_chipc_if.m	optional bhnd
 dev/bhnd/cores/chipc/bhnd_sprom_chipc.c	optional bhnd
 dev/bhnd/cores/chipc/bhnd_pmu_chipc.c	optional bhnd
 dev/bhnd/cores/chipc/chipc.c		optional bhnd
 dev/bhnd/cores/chipc/chipc_cfi.c	optional bhnd cfi 
 dev/bhnd/cores/chipc/chipc_gpio.c	optional bhnd gpio
 dev/bhnd/cores/chipc/chipc_slicer.c	optional bhnd cfi | bhnd spibus
 dev/bhnd/cores/chipc/chipc_spi.c	optional bhnd spibus
 dev/bhnd/cores/chipc/chipc_subr.c	optional bhnd
 dev/bhnd/cores/chipc/pwrctl/bhnd_pwrctl.c	optional bhnd
 dev/bhnd/cores/chipc/pwrctl/bhnd_pwrctl_if.m	optional bhnd
 dev/bhnd/cores/chipc/pwrctl/bhnd_pwrctl_hostb_if.m	optional bhnd
 dev/bhnd/cores/chipc/pwrctl/bhnd_pwrctl_subr.c	optional bhnd
 dev/bhnd/cores/pci/bhnd_pci.c		optional bhnd pci
 dev/bhnd/cores/pci/bhnd_pci_hostb.c	optional bhndb bhnd pci
 dev/bhnd/cores/pci/bhnd_pcib.c		optional bhnd_pcib bhnd pci
 dev/bhnd/cores/pcie2/bhnd_pcie2.c	optional bhnd pci
 dev/bhnd/cores/pcie2/bhnd_pcie2_hostb.c	optional bhndb bhnd pci
 dev/bhnd/cores/pcie2/bhnd_pcie2b.c	optional bhnd_pcie2b bhnd pci
 dev/bhnd/cores/pmu/bhnd_pmu.c		optional bhnd
 dev/bhnd/cores/pmu/bhnd_pmu_core.c	optional bhnd
 dev/bhnd/cores/pmu/bhnd_pmu_if.m	optional bhnd
 dev/bhnd/cores/pmu/bhnd_pmu_subr.c	optional bhnd
 dev/bhnd/nvram/bhnd_nvram_data.c	optional bhnd
 dev/bhnd/nvram/bhnd_nvram_data_bcm.c	optional bhnd
 dev/bhnd/nvram/bhnd_nvram_data_bcmraw.c	optional bhnd
 dev/bhnd/nvram/bhnd_nvram_data_btxt.c	optional bhnd
 dev/bhnd/nvram/bhnd_nvram_data_sprom.c	optional bhnd
 dev/bhnd/nvram/bhnd_nvram_data_sprom_subr.c	optional bhnd
 dev/bhnd/nvram/bhnd_nvram_data_tlv.c	optional bhnd
 dev/bhnd/nvram/bhnd_nvram_if.m		optional bhnd
 dev/bhnd/nvram/bhnd_nvram_io.c		optional bhnd
 dev/bhnd/nvram/bhnd_nvram_iobuf.c	optional bhnd
 dev/bhnd/nvram/bhnd_nvram_ioptr.c	optional bhnd
 dev/bhnd/nvram/bhnd_nvram_iores.c	optional bhnd
 dev/bhnd/nvram/bhnd_nvram_plist.c	optional bhnd
 dev/bhnd/nvram/bhnd_nvram_store.c	optional bhnd
 dev/bhnd/nvram/bhnd_nvram_store_subr.c	optional bhnd
 dev/bhnd/nvram/bhnd_nvram_subr.c	optional bhnd
 dev/bhnd/nvram/bhnd_nvram_value.c	optional bhnd
 dev/bhnd/nvram/bhnd_nvram_value_fmts.c	optional bhnd
 dev/bhnd/nvram/bhnd_nvram_value_prf.c	optional bhnd
 dev/bhnd/nvram/bhnd_nvram_value_subr.c	optional bhnd
 dev/bhnd/nvram/bhnd_sprom.c		optional bhnd
 dev/bhnd/siba/siba.c			optional siba bhnd
 dev/bhnd/siba/siba_bhndb.c		optional siba bhnd bhndb
 dev/bhnd/siba/siba_erom.c		optional siba bhnd
 dev/bhnd/siba/siba_subr.c		optional siba bhnd
 #
 dev/bnxt/bnxt_hwrm.c		optional bnxt iflib pci
 dev/bnxt/bnxt_mgmt.c		optional bnxt iflib pci
 dev/bnxt/bnxt_sysctl.c		optional bnxt iflib pci
 dev/bnxt/bnxt_txrx.c		optional bnxt iflib pci
 dev/bnxt/if_bnxt.c		optional bnxt iflib pci
 dev/bwi/bwimac.c		optional bwi
 dev/bwi/bwiphy.c		optional bwi
 dev/bwi/bwirf.c			optional bwi
 dev/bwi/if_bwi.c		optional bwi
 dev/bwi/if_bwi_pci.c		optional bwi pci
 dev/bwn/if_bwn.c		optional bwn bhnd
 dev/bwn/if_bwn_pci.c		optional bwn pci bhnd bhndb bhndb_pci
 dev/bwn/if_bwn_phy_common.c	optional bwn bhnd
 dev/bwn/if_bwn_phy_g.c		optional bwn bhnd
 dev/bwn/if_bwn_phy_lp.c		optional bwn bhnd
 dev/bwn/if_bwn_phy_n.c		optional bwn bhnd
 dev/bwn/if_bwn_util.c		optional bwn bhnd
 dev/cadence/if_cgem.c		optional cgem fdt
 dev/cardbus/card_if.m		standard
 dev/cardbus/cardbus.c		optional cardbus
 dev/cardbus/cardbus_cis.c	optional cardbus
 dev/cardbus/cardbus_device.c	optional cardbus
 dev/cardbus/power_if.m		standard
 dev/cas/if_cas.c		optional cas
 dev/cfi/cfi_bus_fdt.c		optional cfi fdt
 dev/cfi/cfi_bus_nexus.c		optional cfi
 dev/cfi/cfi_core.c		optional cfi
 dev/cfi/cfi_dev.c		optional cfi
 dev/cfi/cfi_disk.c		optional cfid
 dev/chromebook_platform/chromebook_platform.c	optional chromebook_platform
 dev/ciss/ciss.c			optional ciss
 dev/clk/clk.c			optional clk
 dev/clk/clkdev_if.m		optional clk
 dev/clk/clknode_if.m		optional clk
 dev/clk/clk_bus.c		optional clk fdt
 dev/clk/clk_div.c		optional clk
 dev/clk/clk_fixed.c		optional clk
 dev/clk/clk_gate.c		optional clk
 dev/clk/clk_link.c		optional clk
 dev/clk/clk_mux.c		optional clk
 dev/cpufreq/ichss.c		optional cpufreq pci
 dev/cxgb/cxgb_main.c		optional cxgb pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgb"
 dev/cxgb/cxgb_sge.c		optional cxgb pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgb"
 dev/cxgb/common/cxgb_mc5.c	optional cxgb pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgb"
 dev/cxgb/common/cxgb_vsc7323.c	optional cxgb pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgb"
 dev/cxgb/common/cxgb_vsc8211.c	optional cxgb pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgb"
 dev/cxgb/common/cxgb_ael1002.c	optional cxgb pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgb"
 dev/cxgb/common/cxgb_aq100x.c	optional cxgb pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgb"
 dev/cxgb/common/cxgb_mv88e1xxx.c	optional cxgb pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgb"
 dev/cxgb/common/cxgb_xgmac.c	optional cxgb pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgb"
 dev/cxgb/common/cxgb_t3_hw.c	optional cxgb pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgb"
 dev/cxgb/common/cxgb_tn1010.c	optional cxgb pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgb"
 dev/cxgb/sys/uipc_mvec.c	optional cxgb pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgb"
 dev/cxgb/cxgb_t3fw.c		optional cxgb cxgb_t3fw \
 	compile-with "${NORMAL_C} -I$S/dev/cxgb"
 dev/cxgbe/t4_clip.c		optional cxgbe pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/t4_filter.c		optional cxgbe pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/t4_if.m		optional cxgbe pci
 dev/cxgbe/t4_iov.c		optional cxgbe pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/t4_mp_ring.c		optional cxgbe pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/t4_main.c		optional cxgbe pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/t4_netmap.c		optional cxgbe pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/t4_sched.c		optional cxgbe pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/t4_sge.c		optional cxgbe pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/t4_smt.c		optional cxgbe pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/t4_l2t.c		optional cxgbe pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/t4_tracer.c		optional cxgbe pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/t4_vf.c		optional cxgbev pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/common/t4_hw.c	optional cxgbe pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/common/t4vf_hw.c	optional cxgbev pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/crypto/t6_kern_tls.c	optional cxgbe pci kern_tls \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/crypto/t4_keyctx.c	optional cxgbe pci \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/cudbg/cudbg_common.c	optional cxgbe \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/cudbg/cudbg_flash_utils.c	optional cxgbe \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/cudbg/cudbg_lib.c	optional cxgbe \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/cudbg/cudbg_wtp.c	optional cxgbe \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/cudbg/fastlz.c	optional cxgbe \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cxgbe/cudbg/fastlz_api.c	optional cxgbe \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 t4fw_cfg.c		optional cxgbe					\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk t4fw_cfg.fw:t4fw_cfg t4fw_cfg_uwire.fw:t4fw_cfg_uwire t4fw.fw:t4fw -mt4fw_cfg -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"t4fw_cfg.c"
 t4fw_cfg.fwo		optional cxgbe					\
 	dependency	"t4fw_cfg.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"t4fw_cfg.fwo"
 t4fw_cfg.fw		optional cxgbe					\
 	dependency	"$S/dev/cxgbe/firmware/t4fw_cfg.txt"		\
 	compile-with	"${CP} ${.ALLSRC} ${.TARGET}"			\
 	no-obj no-implicit-rule						\
 	clean		"t4fw_cfg.fw"
 t4fw_cfg_uwire.fwo	optional cxgbe					\
 	dependency	"t4fw_cfg_uwire.fw"				\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"t4fw_cfg_uwire.fwo"
 t4fw_cfg_uwire.fw	optional cxgbe					\
 	dependency	"$S/dev/cxgbe/firmware/t4fw_cfg_uwire.txt"	\
 	compile-with	"${CP} ${.ALLSRC} ${.TARGET}"			\
 	no-obj no-implicit-rule						\
 	clean		"t4fw_cfg_uwire.fw"
 t4fw.fwo		optional cxgbe					\
 	dependency	"t4fw.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"t4fw.fwo"
 t4fw.fw			optional cxgbe					\
 	dependency	"$S/dev/cxgbe/firmware/t4fw-1.27.5.0.bin"	\
 	compile-with	"${CP} ${.ALLSRC} ${.TARGET}"			\
 	no-obj no-implicit-rule						\
 	clean		"t4fw.fw"
 t5fw_cfg.c		optional cxgbe					\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk t5fw_cfg.fw:t5fw_cfg t5fw_cfg_uwire.fw:t5fw_cfg_uwire t5fw.fw:t5fw -mt5fw_cfg -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"t5fw_cfg.c"
 t5fw_cfg.fwo		optional cxgbe					\
 	dependency	"t5fw_cfg.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"t5fw_cfg.fwo"
 t5fw_cfg.fw		optional cxgbe					\
 	dependency	"$S/dev/cxgbe/firmware/t5fw_cfg.txt"		\
 	compile-with	"${CP} ${.ALLSRC} ${.TARGET}"			\
 	no-obj no-implicit-rule						\
 	clean		"t5fw_cfg.fw"
 t5fw_cfg_uwire.fwo	optional cxgbe					\
 	dependency	"t5fw_cfg_uwire.fw"				\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"t5fw_cfg_uwire.fwo"
 t5fw_cfg_uwire.fw	optional cxgbe					\
 	dependency	"$S/dev/cxgbe/firmware/t5fw_cfg_uwire.txt"	\
 	compile-with	"${CP} ${.ALLSRC} ${.TARGET}"			\
 	no-obj no-implicit-rule						\
 	clean		"t5fw_cfg_uwire.fw"
 t5fw.fwo		optional cxgbe					\
 	dependency	"t5fw.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"t5fw.fwo"
 t5fw.fw			optional cxgbe					\
 	dependency	"$S/dev/cxgbe/firmware/t5fw-1.27.5.0.bin"	\
 	compile-with	"${CP} ${.ALLSRC} ${.TARGET}"			\
 	no-obj no-implicit-rule						\
 	clean		"t5fw.fw"
 t6fw_cfg.c		optional cxgbe					\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk t6fw_cfg.fw:t6fw_cfg t6fw_cfg_uwire.fw:t6fw_cfg_uwire t6fw.fw:t6fw -mt6fw_cfg -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"t6fw_cfg.c"
 t6fw_cfg.fwo		optional cxgbe					\
 	dependency	"t6fw_cfg.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"t6fw_cfg.fwo"
 t6fw_cfg.fw		optional cxgbe					\
 	dependency	"$S/dev/cxgbe/firmware/t6fw_cfg.txt"		\
 	compile-with	"${CP} ${.ALLSRC} ${.TARGET}"			\
 	no-obj no-implicit-rule						\
 	clean		"t6fw_cfg.fw"
 t6fw_cfg_uwire.fwo	optional cxgbe					\
 	dependency	"t6fw_cfg_uwire.fw"				\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"t6fw_cfg_uwire.fwo"
 t6fw_cfg_uwire.fw	optional cxgbe					\
 	dependency	"$S/dev/cxgbe/firmware/t6fw_cfg_uwire.txt"	\
 	compile-with	"${CP} ${.ALLSRC} ${.TARGET}"			\
 	no-obj no-implicit-rule						\
 	clean		"t6fw_cfg_uwire.fw"
 t6fw.fwo		optional cxgbe					\
 	dependency	"t6fw.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"t6fw.fwo"
 t6fw.fw			optional cxgbe					\
 	dependency	"$S/dev/cxgbe/firmware/t6fw-1.27.5.0.bin"	\
 	compile-with	"${CP} ${.ALLSRC} ${.TARGET}"			\
 	no-obj no-implicit-rule						\
 	clean		"t6fw.fw"
 dev/cxgbe/crypto/t4_crypto.c	optional ccr \
 	compile-with "${NORMAL_C} -I$S/dev/cxgbe"
 dev/cyapa/cyapa.c		optional cyapa iicbus
 dev/dc/if_dc.c			optional dc pci
 dev/dc/dcphy.c			optional dc pci
 dev/dc/pnphy.c			optional dc pci
 dev/dcons/dcons.c		optional dcons
 dev/dcons/dcons_crom.c		optional dcons_crom
 dev/dcons/dcons_os.c		optional dcons
 dev/dialog/da9063/da9063_if.m	optional da9063_pmic
 dev/dialog/da9063/da9063_iic.c	optional da9063_pmic iicbus fdt
 dev/dialog/da9063/da9063_rtc.c	optional da9063_rtc fdt
 dev/drm2/drm_agpsupport.c	optional drm2
 dev/drm2/drm_auth.c		optional drm2
 dev/drm2/drm_bufs.c		optional drm2
 dev/drm2/drm_buffer.c		optional drm2
 dev/drm2/drm_context.c		optional drm2
 dev/drm2/drm_crtc.c		optional drm2
 dev/drm2/drm_crtc_helper.c	optional drm2
 dev/drm2/drm_dma.c		optional drm2
 dev/drm2/drm_dp_helper.c	optional drm2
 dev/drm2/drm_dp_iic_helper.c	optional drm2
 dev/drm2/drm_drv.c		optional drm2
 dev/drm2/drm_edid.c		optional drm2
 dev/drm2/drm_fb_helper.c	optional drm2
 dev/drm2/drm_fops.c		optional drm2
 dev/drm2/drm_gem.c		optional drm2
 dev/drm2/drm_gem_names.c	optional drm2
 dev/drm2/drm_global.c		optional drm2
 dev/drm2/drm_hashtab.c		optional drm2
 dev/drm2/drm_ioctl.c		optional drm2
 dev/drm2/drm_irq.c		optional drm2
 dev/drm2/drm_linux_list_sort.c	optional drm2
 dev/drm2/drm_lock.c		optional drm2
 dev/drm2/drm_memory.c		optional drm2
 dev/drm2/drm_mm.c		optional drm2
 dev/drm2/drm_modes.c		optional drm2
 dev/drm2/drm_pci.c		optional drm2
 dev/drm2/drm_platform.c		optional drm2
 dev/drm2/drm_scatter.c		optional drm2
 dev/drm2/drm_stub.c		optional drm2
 dev/drm2/drm_sysctl.c		optional drm2
 dev/drm2/drm_vm.c		optional drm2
 dev/drm2/drm_os_freebsd.c	optional drm2
 dev/drm2/ttm/ttm_agp_backend.c	optional drm2
 dev/drm2/ttm/ttm_lock.c		optional drm2
 dev/drm2/ttm/ttm_object.c	optional drm2
 dev/drm2/ttm/ttm_tt.c		optional drm2
 dev/drm2/ttm/ttm_bo_util.c	optional drm2
 dev/drm2/ttm/ttm_bo.c		optional drm2
 dev/drm2/ttm/ttm_bo_manager.c	optional drm2
 dev/drm2/ttm/ttm_execbuf_util.c	optional drm2
 dev/drm2/ttm/ttm_memory.c	optional drm2
 dev/drm2/ttm/ttm_page_alloc.c	optional drm2
 dev/drm2/ttm/ttm_bo_vm.c	optional drm2
 dev/dwc/if_dwc.c		optional dwc fdt
 dev/dwc/if_dwc_if.m		optional dwc fdt
 dev/dwc/dwc1000_core.c		optional dwc fdt
 dev/dwc/dwc1000_dma.c		optional dwc fdt
 dev/efidev/efidev.c		optional efirt
 dev/efidev/efirt.c		optional efirt
 dev/efidev/efirtc.c		optional efirt
 dev/e1000/if_em.c		optional em \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/em_txrx.c		optional em \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/igb_txrx.c		optional em \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/e1000_80003es2lan.c	optional em \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/e1000_82540.c		optional em \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/e1000_82541.c		optional em \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/e1000_82542.c		optional em \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/e1000_82543.c		optional em \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/e1000_82571.c		optional em \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/e1000_82575.c		optional em \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/e1000_ich8lan.c	optional em \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/e1000_i210.c		optional em \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/e1000_api.c		optional em \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/e1000_base.c		optional em \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/e1000_mac.c		optional em \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/e1000_manage.c	optional em \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/e1000_nvm.c		optional em \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/e1000_phy.c		optional em \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/e1000_vf.c		optional em \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/e1000_mbx.c		optional em \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/e1000_osdep.c		optional em \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/et/if_et.c			optional et
 dev/ena/ena.c			optional ena \
 	compile-with "${NORMAL_C} -I$S/contrib"
 dev/ena/ena_datapath.c		optional ena \
 	compile-with "${NORMAL_C} -I$S/contrib"
 dev/ena/ena_netmap.c		optional ena \
 	compile-with "${NORMAL_C} -I$S/contrib"
 dev/ena/ena_rss.c		optional ena \
 	compile-with "${NORMAL_C} -I$S/contrib"
 dev/ena/ena_sysctl.c 		optional ena \
 	compile-with "${NORMAL_C} -I$S/contrib"
 contrib/ena-com/ena_com.c	optional ena
 contrib/ena-com/ena_eth_com.c	optional ena
 dev/etherswitch/arswitch/arswitch.c		optional arswitch
 dev/etherswitch/arswitch/arswitch_reg.c		optional arswitch
 dev/etherswitch/arswitch/arswitch_phy.c		optional arswitch
 dev/etherswitch/arswitch/arswitch_8216.c	optional arswitch
 dev/etherswitch/arswitch/arswitch_8226.c	optional arswitch
 dev/etherswitch/arswitch/arswitch_8316.c	optional arswitch
 dev/etherswitch/arswitch/arswitch_8327.c	optional arswitch
 dev/etherswitch/arswitch/arswitch_vlans.c	optional arswitch
 dev/etherswitch/etherswitch.c		optional etherswitch
 dev/etherswitch/etherswitch_if.m	optional etherswitch
 dev/etherswitch/ip17x/ip17x.c		optional ip17x
 dev/etherswitch/ip17x/ip175c.c		optional ip17x
 dev/etherswitch/ip17x/ip175d.c		optional ip17x
 dev/etherswitch/ip17x/ip17x_phy.c	optional ip17x
 dev/etherswitch/ip17x/ip17x_vlans.c	optional ip17x
 dev/etherswitch/miiproxy.c		optional miiproxy
 dev/etherswitch/rtl8366/rtl8366rb.c	optional rtl8366rb
 dev/etherswitch/e6000sw/e6000sw.c	optional e6000sw fdt
 dev/etherswitch/e6000sw/e6060sw.c	optional e6060sw
 dev/etherswitch/infineon/adm6996fc.c	optional adm6996fc
 dev/etherswitch/micrel/ksz8995ma.c	optional ksz8995ma
 dev/etherswitch/ukswitch/ukswitch.c	optional ukswitch
 dev/evdev/cdev.c			optional evdev
 dev/evdev/evdev.c			optional evdev
 dev/evdev/evdev_mt.c			optional evdev
 dev/evdev/evdev_utils.c			optional evdev
 dev/evdev/uinput.c			optional evdev uinput
 dev/exca/exca.c			optional cbb
 dev/fb/fbd.c			optional fbd | vt
 dev/fb/fb_if.m			standard
 dev/fb/splash.c			optional sc splash
 dev/fdt/fdt_clock.c		optional fdt fdt_clock
 dev/fdt/fdt_clock_if.m		optional fdt fdt_clock
 dev/fdt/fdt_common.c		optional fdt
 dev/fdt/fdt_pinctrl.c		optional fdt fdt_pinctrl
 dev/fdt/fdt_pinctrl_if.m	optional fdt fdt_pinctrl
 dev/fdt/fdt_slicer.c		optional fdt cfi | fdt mx25l | fdt n25q | fdt at45d
 dev/fdt/fdt_static_dtb.S	optional fdt fdt_dtb_static \
 	dependency	"${FDT_DTS_FILE:T:R}.dtb"
 dev/fdt/simplebus.c		optional fdt
 dev/fdt/simple_mfd.c		optional syscon fdt
 dev/filemon/filemon.c		optional filemon
 dev/firewire/firewire.c		optional firewire
 dev/firewire/fwcrom.c		optional firewire
 dev/firewire/fwdev.c		optional firewire
 dev/firewire/fwdma.c		optional firewire
 dev/firewire/fwmem.c		optional firewire
 dev/firewire/fwohci.c		optional firewire
 dev/firewire/fwohci_pci.c	optional firewire pci
 dev/firewire/if_fwe.c		optional fwe
 dev/firewire/if_fwip.c		optional fwip
 dev/firewire/sbp.c		optional sbp
 dev/firewire/sbp_targ.c		optional sbp_targ
 dev/flash/at45d.c		optional at45d
 dev/flash/cqspi.c		optional cqspi fdt xdma
 dev/flash/mx25l.c		optional mx25l
 dev/flash/n25q.c		optional n25q fdt
 dev/flash/qspi_if.m		optional cqspi fdt | n25q fdt
 dev/fxp/if_fxp.c		optional fxp
 dev/fxp/inphy.c			optional fxp
 dev/gem/if_gem.c		optional gem
 dev/gem/if_gem_pci.c		optional gem pci
 dev/gve/gve_adminq.c		optional gve
 dev/gve/gve_main.c		optional gve
 dev/gve/gve_qpl.c		optional gve
 dev/gve/gve_rx.c		optional gve
 dev/gve/gve_sysctl.c		optional gve
 dev/gve/gve_tx.c		optional gve
 dev/gve/gve_utils.c		optional gve
 dev/goldfish/goldfish_rtc.c	optional goldfish_rtc fdt
 dev/gpio/dwgpio/dwgpio.c	optional gpio dwgpio fdt
 dev/gpio/dwgpio/dwgpio_bus.c	optional gpio dwgpio fdt
 dev/gpio/dwgpio/dwgpio_if.m	optional gpio dwgpio fdt
 dev/gpio/gpiobacklight.c	optional gpiobacklight fdt
 dev/gpio/gpiokeys.c		optional gpiokeys fdt
 dev/gpio/gpiokeys_codes.c	optional gpiokeys fdt
 dev/gpio/gpiobus.c		optional gpio				\
 	dependency	"gpiobus_if.h"
 dev/gpio/gpioc.c		optional gpio				\
 	dependency	"gpio_if.h"
 dev/gpio/gpioiic.c		optional gpioiic
 dev/gpio/gpioled.c		optional gpioled !fdt
 dev/gpio/gpioled_fdt.c		optional gpioled fdt
 dev/gpio/gpiomdio.c		optional gpiomdio mii_bitbang
 dev/gpio/gpiopower.c		optional gpiopower fdt
 dev/gpio/gpioregulator.c	optional gpioregulator fdt
 dev/gpio/gpiospi.c		optional gpiospi
 dev/gpio/gpioths.c		optional gpioths
 dev/gpio/gpio_if.m		optional gpio
 dev/gpio/gpiobus_if.m		optional gpio
 dev/gpio/gpiopps.c		optional gpiopps fdt
 dev/gpio/ofw_gpiobus.c		optional fdt gpio
 dev/hid/bcm5974.c		optional bcm5974
 dev/hid/hconf.c			optional hconf
 dev/hid/hcons.c			optional hcons
 dev/hid/hgame.c			optional hgame
 dev/hid/hid.c			optional hid
 dev/hid/hid_if.m		optional hid
 dev/hid/hidbus.c		optional hidbus
 dev/hid/hidmap.c		optional hidmap
 dev/hid/hidquirk.c		optional hid
 dev/hid/hidraw.c		optional hidraw
 dev/hid/hkbd.c			optional hkbd
 dev/hid/hms.c			optional hms
 dev/hid/hmt.c			optional hmt hconf
 dev/hid/hpen.c			optional hpen
 dev/hid/hsctrl.c		optional hsctrl
 dev/hid/ietp.c			optional ietp
 dev/hid/ps4dshock.c		optional ps4dshock
 dev/hid/xb360gp.c		optional xb360gp
 dev/hifn/hifn7751.c		optional hifn
 dev/hptiop/hptiop.c		optional hptiop scbus
 dev/hwpmc/hwpmc_logging.c	optional hwpmc
 dev/hwpmc/hwpmc_mod.c		optional hwpmc
 dev/hwpmc/hwpmc_soft.c		optional hwpmc
 dev/hwreset/hwreset.c		optional hwreset
 dev/hwreset/hwreset_array.c	optional hwreset
 dev/hwreset/hwreset_if.m	optional hwreset
 dev/ichiic/ig4_acpi.c		optional ig4 acpi iicbus
 dev/ichiic/ig4_iic.c		optional ig4 iicbus
 dev/ichiic/ig4_pci.c		optional ig4 pci iicbus
 dev/ichsmb/ichsmb.c		optional ichsmb
 dev/ichsmb/ichsmb_pci.c		optional ichsmb pci
 dev/ida/ida.c			optional ida
 dev/ida/ida_disk.c		optional ida
 dev/ida/ida_pci.c		optional ida pci
 dev/iicbus/acpi_iicbus.c	optional acpi iicbus | acpi compat_linuxkpi
 dev/iicbus/icee.c		optional icee
 dev/iicbus/if_ic.c		optional ic
 dev/iicbus/iic.c		optional iic
 dev/iicbus/iic_recover_bus.c	optional iicbus | compat_linuxkpi
 dev/iicbus/iicbb.c		optional iicbb | compat_linuxkpi
 dev/iicbus/iicbb_if.m		optional iicbb | compat_linuxkpi
 dev/iicbus/iicbus.c		optional iicbus | compat_linuxkpi
 dev/iicbus/iicbus_if.m		optional iicbus | compat_linuxkpi
 dev/iicbus/iichid.c		optional iichid acpi hid iicbus
 dev/iicbus/iiconf.c		optional iicbus | compat_linuxkpi
 dev/iicbus/iicsmb.c		optional iicsmb				\
 	dependency	"iicbus_if.h"
 dev/iicbus/adc/ad7418.c		optional ad7418
 dev/iicbus/adc/ads111x.c	optional ads111x
 dev/iicbus/adc/pcf8591.c	optional pcf8591
 dev/iicbus/controller/opencores/iicoc.c	optional iicoc
 dev/iicbus/controller/opencores/iicoc_fdt.c	optional iicoc fdt
 dev/iicbus/controller/opencores/iicoc_pci.c	optional iicoc pci
 dev/iicbus/mux/iicmux.c		optional iicmux
 dev/iicbus/mux/iicmux_if.m	optional iicmux
 dev/iicbus/mux/iic_gpiomux.c	optional iic_gpiomux fdt
 dev/iicbus/mux/ltc430x.c	optional ltc430x
 dev/iicbus/mux/pca954x.c	optional pca954x iicbus iicmux
 dev/iicbus/ofw_iicbus.c		optional fdt iicbus
 dev/iicbus/ofw_iicbus_if.m	optional fdt iicbus
 dev/iicbus/rtc/ds1307.c		optional ds1307
 dev/iicbus/rtc/ds13rtc.c	optional ds13rtc | ds133x | ds1374
 dev/iicbus/rtc/ds1672.c		optional ds1672
 dev/iicbus/rtc/ds3231.c		optional ds3231
 dev/iicbus/rtc/isl12xx.c	optional isl12xx
 dev/iicbus/rtc/nxprtc.c		optional nxprtc | pcf8563
 dev/iicbus/rtc/pcf85063.c	optional pcf85063 iicbus fdt
 dev/iicbus/rtc/rtc8583.c	optional rtc8583
 dev/iicbus/rtc/rv3032.c		optional rv3032 iicbus fdt
 dev/iicbus/rtc/rx8803.c		optional rx8803 iicbus fdt
 dev/iicbus/rtc/s35390a.c	optional s35390a
 dev/iicbus/sensor/htu21.c	optional htu21
 dev/iicbus/sensor/lm75.c	optional lm75
 dev/iicbus/sensor/max44009.c	optional max44009
 dev/iicbus/gpio/pcf8574.c	optional pcf8574
 dev/iicbus/gpio/tca64xx.c	optional tca64xx fdt gpio
 dev/iicbus/pmic/fan53555.c	optional fan53555 fdt | tcs4525 fdt
 dev/iicbus/pmic/silergy/sy8106a.c	optional sy8106a fdt
 dev/iicbus/pmic/silergy/syr827.c	optional syr827 fdt
 dev/igc/if_igc.c		optional igc iflib pci
 dev/igc/igc_api.c		optional igc iflib pci
 dev/igc/igc_base.c		optional igc iflib pci
 dev/igc/igc_i225.c		optional igc iflib pci
 dev/igc/igc_mac.c		optional igc iflib pci
 dev/igc/igc_nvm.c		optional igc iflib pci
 dev/igc/igc_phy.c		optional igc iflib pci
 dev/igc/igc_txrx.c		optional igc iflib pci
 dev/intpm/intpm.c		optional intpm pci
 # XXX Work around clang warning, until maintainer approves fix.
 dev/ips/ips.c			optional ips \
 	compile-with "${NORMAL_C} ${NO_WSOMETIMES_UNINITIALIZED}"
 dev/ips/ips_commands.c		optional ips
 dev/ips/ips_disk.c		optional ips
 dev/ips/ips_ioctl.c		optional ips
 dev/ips/ips_pci.c		optional ips pci
 dev/ipw/if_ipw.c		optional ipw
 ipwbssfw.c			optional ipwbssfw | ipwfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk ipw_bss.fw:ipw_bss:130 -lintel_ipw -mipw_bss -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"ipwbssfw.c"
 ipw_bss.fwo			optional ipwbssfw | ipwfw		\
 	dependency	"ipw_bss.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"ipw_bss.fwo"
 ipw_bss.fw			optional ipwbssfw | ipwfw		\
 	dependency	"$S/contrib/dev/ipw/ipw2100-1.3.fw.uu"		\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"ipw_bss.fw"
 ipwibssfw.c			optional ipwibssfw | ipwfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk ipw_ibss.fw:ipw_ibss:130 -lintel_ipw -mipw_ibss -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"ipwibssfw.c"
 ipw_ibss.fwo			optional ipwibssfw | ipwfw		\
 	dependency	"ipw_ibss.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"ipw_ibss.fwo"
 ipw_ibss.fw			optional ipwibssfw | ipwfw		\
 	dependency	"$S/contrib/dev/ipw/ipw2100-1.3-i.fw.uu"	\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"ipw_ibss.fw"
 ipwmonitorfw.c			optional ipwmonitorfw | ipwfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk ipw_monitor.fw:ipw_monitor:130 -lintel_ipw -mipw_monitor -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"ipwmonitorfw.c"
 ipw_monitor.fwo			optional ipwmonitorfw | ipwfw		\
 	dependency	"ipw_monitor.fw"				\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"ipw_monitor.fwo"
 ipw_monitor.fw			optional ipwmonitorfw | ipwfw		\
 	dependency	"$S/contrib/dev/ipw/ipw2100-1.3-p.fw.uu"	\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"ipw_monitor.fw"
 dev/iscsi/icl.c			optional iscsi
 dev/iscsi/icl_conn_if.m		optional cfiscsi | iscsi
 dev/iscsi/icl_soft.c		optional iscsi
 dev/iscsi/icl_soft_proxy.c	optional iscsi
 dev/iscsi/iscsi.c		optional iscsi scbus
 dev/ismt/ismt.c			optional ismt
 dev/isl/isl.c			optional isl iicbus
 dev/isp/isp.c			optional isp
 dev/isp/isp_freebsd.c		optional isp
 dev/isp/isp_library.c		optional isp
 dev/isp/isp_pci.c		optional isp pci
 dev/isp/isp_target.c		optional isp
 dev/ispfw/ispfw.c		optional ispfw
 dev/iwi/if_iwi.c		optional iwi
 iwibssfw.c			optional iwibssfw | iwifw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwi_bss.fw:iwi_bss:300 -lintel_iwi -miwi_bss -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwibssfw.c"
 iwi_bss.fwo			optional iwibssfw | iwifw		\
 	dependency	"iwi_bss.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwi_bss.fwo"
 iwi_bss.fw			optional iwibssfw | iwifw		\
 	dependency	"$S/contrib/dev/iwi/ipw2200-bss.fw.uu"		\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwi_bss.fw"
 iwiibssfw.c			optional iwiibssfw | iwifw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwi_ibss.fw:iwi_ibss:300 -lintel_iwi -miwi_ibss -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwiibssfw.c"
 iwi_ibss.fwo			optional iwiibssfw | iwifw		\
 	dependency	"iwi_ibss.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwi_ibss.fwo"
 iwi_ibss.fw			optional iwiibssfw | iwifw		\
 	dependency	"$S/contrib/dev/iwi/ipw2200-ibss.fw.uu"		\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwi_ibss.fw"
 iwimonitorfw.c			optional iwimonitorfw | iwifw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwi_monitor.fw:iwi_monitor:300 -lintel_iwi -miwi_monitor -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwimonitorfw.c"
 iwi_monitor.fwo			optional iwimonitorfw | iwifw		\
 	dependency	"iwi_monitor.fw"				\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwi_monitor.fwo"
 iwi_monitor.fw			optional iwimonitorfw | iwifw		\
 	dependency	"$S/contrib/dev/iwi/ipw2200-sniffer.fw.uu"	\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwi_monitor.fw"
 dev/iwm/if_iwm.c		optional iwm
 dev/iwm/if_iwm_7000.c		optional iwm
 dev/iwm/if_iwm_8000.c		optional iwm
 dev/iwm/if_iwm_9000.c		optional iwm
 dev/iwm/if_iwm_9260.c		optional iwm
 dev/iwm/if_iwm_binding.c	optional iwm
 dev/iwm/if_iwm_fw.c		optional iwm
 dev/iwm/if_iwm_led.c		optional iwm
 dev/iwm/if_iwm_mac_ctxt.c	optional iwm
 dev/iwm/if_iwm_notif_wait.c	optional iwm
 dev/iwm/if_iwm_pcie_trans.c	optional iwm
 dev/iwm/if_iwm_phy_ctxt.c	optional iwm
 dev/iwm/if_iwm_phy_db.c		optional iwm
 dev/iwm/if_iwm_power.c		optional iwm
 dev/iwm/if_iwm_scan.c		optional iwm
 dev/iwm/if_iwm_sf.c		optional iwm
 dev/iwm/if_iwm_sta.c		optional iwm
 dev/iwm/if_iwm_time_event.c	optional iwm
 dev/iwm/if_iwm_util.c		optional iwm
 iwm3160fw.c			optional iwm3160fw | iwmfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwm3160.fw:iwm3160fw -miwm3160fw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwm3160fw.c"
 iwm3160fw.fwo			optional iwm3160fw | iwmfw		\
 	dependency	"iwm3160.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwm3160fw.fwo"
 iwm3160.fw			optional iwm3160fw | iwmfw		\
 	dependency	"$S/contrib/dev/iwm/iwm-3160-17.fw.uu" \
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwm3160.fw"
 iwm3168fw.c			optional iwm3168fw | iwmfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwm3168.fw:iwm3168fw -miwm3168fw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwm3168fw.c"
 iwm3168fw.fwo			optional iwm3168fw | iwmfw		\
 	dependency	"iwm3168.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwm3168fw.fwo"
 iwm3168.fw			optional iwm3168fw | iwmfw		\
 	dependency	"$S/contrib/dev/iwm/iwm-3168-22.fw.uu"		\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwm3168.fw"
 iwm7260fw.c			optional iwm7260fw | iwmfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwm7260.fw:iwm7260fw -miwm7260fw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwm7260fw.c"
 iwm7260fw.fwo			optional iwm7260fw | iwmfw		\
 	dependency	"iwm7260.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwm7260fw.fwo"
 iwm7260.fw			optional iwm7260fw | iwmfw		\
 	dependency	"$S/contrib/dev/iwm/iwm-7260-17.fw.uu" \
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwm7260.fw"
 iwm7265fw.c			optional iwm7265fw | iwmfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwm7265.fw:iwm7265fw -miwm7265fw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwm7265fw.c"
 iwm7265fw.fwo			optional iwm7265fw | iwmfw		\
 	dependency	"iwm7265.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwm7265fw.fwo"
 iwm7265.fw			optional iwm7265fw | iwmfw		\
 	dependency	"$S/contrib/dev/iwm/iwm-7265-17.fw.uu" \
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwm7265.fw"
 iwm7265Dfw.c			optional iwm7265Dfw | iwmfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwm7265D.fw:iwm7265Dfw -miwm7265Dfw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwm7265Dfw.c"
 iwm7265Dfw.fwo			optional iwm7265Dfw | iwmfw		\
 	dependency	"iwm7265D.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwm7265Dfw.fwo"
 iwm7265D.fw			optional iwm7265Dfw | iwmfw		\
 	dependency	"$S/contrib/dev/iwm/iwm-7265D-17.fw.uu"		\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwm7265D.fw"
 iwm8000Cfw.c			optional iwm8000Cfw | iwmfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwm8000C.fw:iwm8000Cfw -miwm8000Cfw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwm8000Cfw.c"
 iwm8000Cfw.fwo			optional iwm8000Cfw | iwmfw		\
 	dependency	"iwm8000C.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwm8000Cfw.fwo"
 iwm8000C.fw			optional iwm8000Cfw | iwmfw		\
 	dependency	"$S/contrib/dev/iwm/iwm-8000C-16.fw.uu" \
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwm8000C.fw"
 iwm8265.fw			optional iwm8265fw | iwmfw		\
 	dependency	"$S/contrib/dev/iwm/iwm-8265-22.fw.uu" \
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwm8265.fw"
 iwm8265fw.c			optional iwm8265fw | iwmfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwm8265.fw:iwm8265fw -miwm8265fw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwm8265fw.c"
 iwm8265fw.fwo			optional iwm8265fw | iwmfw		\
 	dependency	"iwm8265.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwm8265fw.fwo"
 dev/iwn/if_iwn.c		optional iwn
 iwn1000fw.c			optional iwn1000fw | iwnfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwn1000.fw:iwn1000fw -miwn1000fw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwn1000fw.c"
 iwn1000fw.fwo			optional iwn1000fw | iwnfw		\
 	dependency	"iwn1000.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwn1000fw.fwo"
 iwn1000.fw			optional iwn1000fw | iwnfw		\
 	dependency	"$S/contrib/dev/iwn/iwlwifi-1000-39.31.5.1.fw.uu" \
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwn1000.fw"
 iwn100fw.c			optional iwn100fw | iwnfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwn100.fw:iwn100fw -miwn100fw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwn100fw.c"
 iwn100fw.fwo			optional iwn100fw | iwnfw		\
 	dependency	"iwn100.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwn100fw.fwo"
 iwn100.fw			optional iwn100fw | iwnfw		\
 	dependency	"$S/contrib/dev/iwn/iwlwifi-100-39.31.5.1.fw.uu" \
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwn100.fw"
 iwn105fw.c			optional iwn105fw | iwnfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwn105.fw:iwn105fw -miwn105fw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwn105fw.c"
 iwn105fw.fwo			optional iwn105fw | iwnfw		\
 	dependency	"iwn105.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwn105fw.fwo"
 iwn105.fw			optional iwn105fw | iwnfw		\
 	dependency	"$S/contrib/dev/iwn/iwlwifi-105-6-18.168.6.1.fw.uu" \
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwn105.fw"
 iwn135fw.c			optional iwn135fw | iwnfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwn135.fw:iwn135fw -miwn135fw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwn135fw.c"
 iwn135fw.fwo			optional iwn135fw | iwnfw		\
 	dependency	"iwn135.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwn135fw.fwo"
 iwn135.fw			optional iwn135fw | iwnfw		\
 	dependency	"$S/contrib/dev/iwn/iwlwifi-135-6-18.168.6.1.fw.uu" \
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwn135.fw"
 iwn2000fw.c			optional iwn2000fw | iwnfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwn2000.fw:iwn2000fw -miwn2000fw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwn2000fw.c"
 iwn2000fw.fwo			optional iwn2000fw | iwnfw		\
 	dependency	"iwn2000.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwn2000fw.fwo"
 iwn2000.fw			optional iwn2000fw | iwnfw		\
 	dependency	"$S/contrib/dev/iwn/iwlwifi-2000-18.168.6.1.fw.uu" \
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwn2000.fw"
 iwn2030fw.c			optional iwn2030fw | iwnfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwn2030.fw:iwn2030fw -miwn2030fw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwn2030fw.c"
 iwn2030fw.fwo			optional iwn2030fw | iwnfw		\
 	dependency	"iwn2030.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwn2030fw.fwo"
 iwn2030.fw			optional iwn2030fw | iwnfw		\
 	dependency	"$S/contrib/dev/iwn/iwnwifi-2030-18.168.6.1.fw.uu" \
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwn2030.fw"
 iwn4965fw.c			optional iwn4965fw | iwnfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwn4965.fw:iwn4965fw -miwn4965fw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwn4965fw.c"
 iwn4965fw.fwo			optional iwn4965fw | iwnfw		\
 	dependency	"iwn4965.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwn4965fw.fwo"
 iwn4965.fw			optional iwn4965fw | iwnfw		\
 	dependency	"$S/contrib/dev/iwn/iwlwifi-4965-228.61.2.24.fw.uu" \
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwn4965.fw"
 iwn5000fw.c			optional iwn5000fw | iwnfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwn5000.fw:iwn5000fw -miwn5000fw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwn5000fw.c"
 iwn5000fw.fwo		optional iwn5000fw | iwnfw			\
 	dependency	"iwn5000.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwn5000fw.fwo"
 iwn5000.fw			optional iwn5000fw | iwnfw		\
 	dependency	"$S/contrib/dev/iwn/iwlwifi-5000-8.83.5.1.fw.uu" \
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwn5000.fw"
 iwn5150fw.c			optional iwn5150fw | iwnfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwn5150.fw:iwn5150fw -miwn5150fw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwn5150fw.c"
 iwn5150fw.fwo			optional iwn5150fw | iwnfw		\
 	dependency	"iwn5150.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwn5150fw.fwo"
 iwn5150.fw			optional iwn5150fw | iwnfw		\
 	dependency	"$S/contrib/dev/iwn/iwlwifi-5150-8.24.2.2.fw.uu"\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwn5150.fw"
 iwn6000fw.c			optional iwn6000fw | iwnfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwn6000.fw:iwn6000fw -miwn6000fw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwn6000fw.c"
 iwn6000fw.fwo			optional iwn6000fw | iwnfw		\
 	dependency	"iwn6000.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwn6000fw.fwo"
 iwn6000.fw			optional iwn6000fw | iwnfw		\
 	dependency	"$S/contrib/dev/iwn/iwlwifi-6000-9.221.4.1.fw.uu" \
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwn6000.fw"
 iwn6000g2afw.c			optional iwn6000g2afw | iwnfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwn6000g2a.fw:iwn6000g2afw -miwn6000g2afw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwn6000g2afw.c"
 iwn6000g2afw.fwo		optional iwn6000g2afw | iwnfw		\
 	dependency	"iwn6000g2a.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwn6000g2afw.fwo"
 iwn6000g2a.fw			optional iwn6000g2afw | iwnfw		\
 	dependency	"$S/contrib/dev/iwn/iwlwifi-6000g2a-18.168.6.1.fw.uu" \
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwn6000g2a.fw"
 iwn6000g2bfw.c			optional iwn6000g2bfw | iwnfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwn6000g2b.fw:iwn6000g2bfw -miwn6000g2bfw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwn6000g2bfw.c"
 iwn6000g2bfw.fwo		optional iwn6000g2bfw | iwnfw		\
 	dependency	"iwn6000g2b.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwn6000g2bfw.fwo"
 iwn6000g2b.fw			optional iwn6000g2bfw | iwnfw		\
 	dependency	"$S/contrib/dev/iwn/iwlwifi-6000g2b-18.168.6.1.fw.uu" \
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwn6000g2b.fw"
 iwn6050fw.c			optional iwn6050fw | iwnfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk iwn6050.fw:iwn6050fw -miwn6050fw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"iwn6050fw.c"
 iwn6050fw.fwo			optional iwn6050fw | iwnfw		\
 	dependency	"iwn6050.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"iwn6050fw.fwo"
 iwn6050.fw			optional iwn6050fw | iwnfw		\
 	dependency	"$S/contrib/dev/iwn/iwlwifi-6050-41.28.5.1.fw.uu" \
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"iwn6050.fw"
 dev/ixgbe/if_ix.c		optional ix inet \
 	compile-with "${NORMAL_C} -I$S/dev/ixgbe -DSMP"
 dev/ixgbe/if_ixv.c		optional ixv inet \
 	compile-with "${NORMAL_C} -I$S/dev/ixgbe -DSMP"
 dev/ixgbe/if_bypass.c		optional ix inet \
 	compile-with "${NORMAL_C} -I$S/dev/ixgbe"
 dev/ixgbe/if_fdir.c		optional ix inet | ixv inet \
 	compile-with "${NORMAL_C} -I$S/dev/ixgbe"
 dev/ixgbe/if_sriov.c		optional ix inet \
 	compile-with "${NORMAL_C} -I$S/dev/ixgbe"
 dev/ixgbe/ix_txrx.c		optional ix inet | ixv inet \
 	compile-with "${NORMAL_C} -I$S/dev/ixgbe"
 dev/ixgbe/ixgbe_osdep.c		optional ix inet | ixv inet \
 	compile-with "${NORMAL_C} -I$S/dev/ixgbe"
 dev/ixgbe/ixgbe_phy.c		optional ix inet | ixv inet \
 	compile-with "${NORMAL_C} -I$S/dev/ixgbe"
 dev/ixgbe/ixgbe_api.c		optional ix inet | ixv inet \
 	compile-with "${NORMAL_C} -I$S/dev/ixgbe"
 dev/ixgbe/ixgbe_common.c	optional ix inet | ixv inet \
 	compile-with "${NORMAL_C} -I$S/dev/ixgbe"
 dev/ixgbe/ixgbe_mbx.c		optional ix inet | ixv inet \
 	compile-with "${NORMAL_C} -I$S/dev/ixgbe"
 dev/ixgbe/ixgbe_vf.c		optional ix inet | ixv inet \
 	compile-with "${NORMAL_C} -I$S/dev/ixgbe"
 dev/ixgbe/ixgbe_82598.c		optional ix inet | ixv inet \
 	compile-with "${NORMAL_C} -I$S/dev/ixgbe"
 dev/ixgbe/ixgbe_82599.c		optional ix inet | ixv inet \
 	compile-with "${NORMAL_C} -I$S/dev/ixgbe"
 dev/ixgbe/ixgbe_x540.c		optional ix inet | ixv inet \
 	compile-with "${NORMAL_C} -I$S/dev/ixgbe"
 dev/ixgbe/ixgbe_x550.c		optional ix inet | ixv inet \
 	compile-with "${NORMAL_C} -I$S/dev/ixgbe"
 dev/ixgbe/ixgbe_dcb.c		optional ix inet | ixv inet \
 	compile-with "${NORMAL_C} -I$S/dev/ixgbe"
 dev/ixgbe/ixgbe_dcb_82598.c	optional ix inet | ixv inet \
 	compile-with "${NORMAL_C} -I$S/dev/ixgbe"
 dev/ixgbe/ixgbe_dcb_82599.c	optional ix inet | ixv inet \
 	compile-with "${NORMAL_C} -I$S/dev/ixgbe"
 dev/jedec_dimm/jedec_dimm.c	optional jedec_dimm smbus
 dev/jme/if_jme.c		optional jme pci
 dev/kbd/kbd.c			optional atkbd | pckbd | sc | ukbd | vt | hkbd
 dev/kbdmux/kbdmux.c		optional kbdmux
 dev/ksyms/ksyms.c		optional ksyms
 dev/le/am7990.c			optional le
 dev/le/am79900.c		optional le
 dev/le/if_le_pci.c		optional le pci
 dev/le/lance.c			optional le
 dev/led/led.c			standard
 dev/lge/if_lge.c		optional lge
 dev/liquidio/base/cn23xx_pf_device.c		optional lio	\
 	compile-with "${NORMAL_C}				\
 	-I$S/dev/liquidio -I$S/dev/liquidio/base -DSMP"
 dev/liquidio/base/lio_console.c			optional lio	\
 	compile-with "${NORMAL_C}				\
 	-I$S/dev/liquidio -I$S/dev/liquidio/base -DSMP"
 dev/liquidio/base/lio_ctrl.c			optional lio	\
 	compile-with "${NORMAL_C} 				\
 	-I$S/dev/liquidio -I$S/dev/liquidio/base -DSMP"
 dev/liquidio/base/lio_device.c			optional lio	\
 	compile-with "${NORMAL_C} 				\
 	-I$S/dev/liquidio -I$S/dev/liquidio/base -DSMP"
 dev/liquidio/base/lio_droq.c			optional lio	\
 	compile-with "${NORMAL_C} 				\
 	-I$S/dev/liquidio -I$S/dev/liquidio/base -DSMP"
 dev/liquidio/base/lio_mem_ops.c			optional lio	\
 	compile-with "${NORMAL_C} 				\
 	-I$S/dev/liquidio -I$S/dev/liquidio/base -DSMP"
 dev/liquidio/base/lio_request_manager.c		optional lio	\
 	compile-with "${NORMAL_C} 				\
 	-I$S/dev/liquidio -I$S/dev/liquidio/base -DSMP"
 dev/liquidio/base/lio_response_manager.c	optional lio	\
 	compile-with "${NORMAL_C} 				\
 	-I$S/dev/liquidio -I$S/dev/liquidio/base -DSMP"
 dev/liquidio/lio_core.c				optional lio	\
 	compile-with "${NORMAL_C} 				\
 	-I$S/dev/liquidio -I$S/dev/liquidio/base -DSMP"
 dev/liquidio/lio_ioctl.c			optional lio	\
 	compile-with "${NORMAL_C} 				\
 	-I$S/dev/liquidio -I$S/dev/liquidio/base -DSMP"
 dev/liquidio/lio_main.c				optional lio	\
 	compile-with "${NORMAL_C} 				\
 	-I$S/dev/liquidio -I$S/dev/liquidio/base -DSMP"
 dev/liquidio/lio_rss.c				optional lio	\
 	compile-with "${NORMAL_C} 				\
 	-I$S/dev/liquidio -I$S/dev/liquidio/base -DSMP"
 dev/liquidio/lio_rxtx.c				optional lio	\
 	compile-with "${NORMAL_C} 				\
 	-I$S/dev/liquidio -I$S/dev/liquidio/base -DSMP"
 dev/liquidio/lio_sysctl.c			optional lio	\
 	compile-with "${NORMAL_C} 				\
 	-I$S/dev/liquidio -I$S/dev/liquidio/base -DSMP"
 lio.c	optional lio						\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk lio_23xx_nic.bin.fw:lio_23xx_nic.bin -mlio_23xx_nic.bin -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local	\
 	clean		"lio.c"
 lio_23xx_nic.bin.fw.fwo optional lio				\
 	dependency	"lio_23xx_nic.bin.fw"			\
 	compile-with	"${NORMAL_FWO}"				\
 	no-implicit-rule					\
 	clean		"lio_23xx_nic.bin.fw.fwo"
 lio_23xx_nic.bin.fw	optional lio					\
 	dependency	"$S/contrib/dev/liquidio/lio_23xx_nic.bin.uu"	\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"lio_23xx_nic.bin.fw"
 dev/malo/if_malo.c		optional malo
 dev/malo/if_malohal.c		optional malo
 dev/malo/if_malo_pci.c		optional malo pci
 dev/md/md.c			optional md
 dev/mdio/mdio_if.m		optional miiproxy | mdio
 dev/mdio/mdio.c			optional miiproxy | mdio
 dev/mem/memdev.c		optional mem
 dev/mem/memutil.c		optional mem
 dev/mfi/mfi.c			optional mfi
 dev/mfi/mfi_debug.c		optional mfi
 dev/mfi/mfi_pci.c		optional mfi pci
 dev/mfi/mfi_disk.c		optional mfi
 dev/mfi/mfi_syspd.c		optional mfi
 dev/mfi/mfi_tbolt.c		optional mfi
 dev/mfi/mfi_cam.c		optional mfip scbus
 dev/mii/acphy.c			optional miibus | acphy
 dev/mii/amphy.c			optional miibus | amphy
 dev/mii/atphy.c			optional miibus | atphy
 dev/mii/axphy.c			optional miibus | axphy
 dev/mii/bmtphy.c		optional miibus | bmtphy
 dev/mii/brgphy.c		optional miibus | brgphy
 dev/mii/ciphy.c			optional miibus | ciphy
 dev/mii/dp83822phy.c		optional miibus | dp83822phy
 dev/mii/dp83867phy.c		optional miibus | dp83867phy
 dev/mii/e1000phy.c		optional miibus | e1000phy
 dev/mii/gentbi.c		optional miibus | gentbi
 dev/mii/icsphy.c		optional miibus | icsphy
 dev/mii/ip1000phy.c		optional miibus | ip1000phy
 dev/mii/jmphy.c			optional miibus | jmphy
 dev/mii/lxtphy.c		optional miibus | lxtphy
 dev/mii/mcommphy.c		optional miibus | mcommphy
 dev/mii/micphy.c		optional miibus fdt | micphy fdt
 dev/mii/mii.c			optional miibus | mii
 dev/mii/mii_bitbang.c		optional miibus | mii_bitbang
 dev/mii/mii_physubr.c		optional miibus | mii
 dev/mii/mii_fdt.c		optional miibus fdt | mii fdt
 dev/mii/miibus_if.m		optional miibus | mii
 dev/mii/mv88e151x.c		optional miibus | mv88e151x
 dev/mii/nsgphy.c		optional miibus | nsgphy
 dev/mii/nsphy.c			optional miibus | nsphy
 dev/mii/nsphyter.c		optional miibus | nsphyter
 dev/mii/pnaphy.c		optional miibus | pnaphy
 dev/mii/qsphy.c			optional miibus | qsphy
 dev/mii/rdcphy.c		optional miibus | rdcphy
 dev/mii/rgephy.c		optional miibus | rgephy
 dev/mii/rlphy.c			optional miibus | rlphy
 dev/mii/rlswitch.c		optional rlswitch
 dev/mii/smcphy.c		optional miibus | smcphy
 dev/mii/smscphy.c		optional miibus | smscphy
 dev/mii/tdkphy.c		optional miibus | tdkphy
 dev/mii/truephy.c		optional miibus | truephy
 dev/mii/ukphy.c			optional miibus | mii
 dev/mii/ukphy_subr.c		optional miibus | mii
 dev/mii/vscphy.c		optional miibus | vscphy
 dev/mii/xmphy.c			optional miibus | xmphy
 dev/mlxfw/mlxfw_fsm.c			optional mlxfw \
 	compile-with "${MLXFW_C}"
 dev/mlxfw/mlxfw_mfa2.c			optional mlxfw \
 	compile-with "${MLXFW_C}"
 dev/mlxfw/mlxfw_mfa2_tlv_multi.c	optional mlxfw \
 	compile-with "${MLXFW_C}"
 dev/mlx/mlx.c			optional mlx
 dev/mlx/mlx_disk.c		optional mlx
 dev/mlx/mlx_pci.c		optional mlx pci
 dev/mmc/host/dwmmc.c		optional dwmmc fdt
 dev/mmc/mmc_subr.c		optional mmc | mmcsd !mmccam
 dev/mmc/mmc.c			optional mmc !mmccam
 dev/mmc/mmcbr_if.m		standard
 dev/mmc/mmcbus_if.m		standard
 dev/mmc/mmcsd.c			optional mmcsd !mmccam
 dev/mmc/mmc_fdt_helpers.c	optional mmc regulator clk fdt | mmccam regulator clk fdt
 dev/mmc/mmc_helpers.c		optional mmc gpio regulator clk | mmccam gpio regulator clk
 dev/mmc/mmc_pwrseq.c		optional mmc clk regulator fdt | mmccam clk regulator fdt
 dev/mmc/mmc_pwrseq_if.m		optional mmc clk regulator fdt | mmccam clk regulator fdt
 dev/mmcnull/mmcnull.c		optional mmcnull
 dev/mpr/mpr.c			optional mpr
 dev/mpr/mpr_config.c		optional mpr
 # XXX Work around clang warning, until maintainer approves fix.
 dev/mpr/mpr_mapping.c		optional mpr \
 	compile-with "${NORMAL_C} ${NO_WSOMETIMES_UNINITIALIZED}"
 dev/mpr/mpr_pci.c		optional mpr pci
 dev/mpr/mpr_sas.c		optional mpr \
 	compile-with "${NORMAL_C} ${NO_WUNNEEDED_INTERNAL_DECL}"
 dev/mpr/mpr_sas_lsi.c		optional mpr
 dev/mpr/mpr_table.c		optional mpr
 dev/mpr/mpr_user.c		optional mpr
 dev/mps/mps.c			optional mps
 dev/mps/mps_config.c		optional mps
 # XXX Work around clang warning, until maintainer approves fix.
 dev/mps/mps_mapping.c		optional mps \
 	compile-with "${NORMAL_C} ${NO_WSOMETIMES_UNINITIALIZED}"
 dev/mps/mps_pci.c		optional mps pci
 dev/mps/mps_sas.c		optional mps \
 	compile-with "${NORMAL_C} ${NO_WUNNEEDED_INTERNAL_DECL}"
 dev/mps/mps_sas_lsi.c		optional mps
 dev/mps/mps_table.c		optional mps
 dev/mps/mps_user.c		optional mps
 dev/mpt/mpt.c			optional mpt
 dev/mpt/mpt_cam.c		optional mpt
 dev/mpt/mpt_debug.c		optional mpt
 dev/mpt/mpt_pci.c		optional mpt pci
 dev/mpt/mpt_raid.c		optional mpt
 dev/mpt/mpt_user.c		optional mpt
 dev/mrsas/mrsas.c		optional mrsas
 dev/mrsas/mrsas_cam.c		optional mrsas
 dev/mrsas/mrsas_ioctl.c		optional mrsas
 dev/mrsas/mrsas_fp.c		optional mrsas
 dev/msk/if_msk.c		optional msk
 dev/mvs/mvs.c			optional mvs
 dev/mvs/mvs_if.m		optional mvs
 dev/mvs/mvs_pci.c		optional mvs pci
 dev/mwl/if_mwl.c		optional mwl
 dev/mwl/if_mwl_pci.c		optional mwl pci
 dev/mwl/mwlhal.c		optional mwl
 mwlfw.c				optional mwlfw				\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk mw88W8363.fw:mw88W8363fw mwlboot.fw:mwlboot -mmwl -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"mwlfw.c"
 mw88W8363.fwo		optional mwlfw					\
 	dependency	"mw88W8363.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"mw88W8363.fwo"
 mw88W8363.fw		optional mwlfw					\
 	dependency	"$S/contrib/dev/mwl/mw88W8363.fw.uu"		\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"mw88W8363.fw"
 mwlboot.fwo		optional mwlfw					\
 	dependency	"mwlboot.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"mwlboot.fwo"
 mwlboot.fw		optional mwlfw					\
 	dependency	"$S/contrib/dev/mwl/mwlboot.fw.uu"		\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"mwlboot.fw"
 dev/mxge/if_mxge.c		optional mxge pci
 dev/mxge/mxge_eth_z8e.c		optional mxge pci
 dev/mxge/mxge_ethp_z8e.c	optional mxge pci
 dev/mxge/mxge_rss_eth_z8e.c	optional mxge pci
 dev/mxge/mxge_rss_ethp_z8e.c	optional mxge pci
 dev/my/if_my.c			optional my
 dev/netmap/if_ptnet.c		optional netmap inet
 dev/netmap/netmap.c		optional netmap
 dev/netmap/netmap_bdg.c		optional netmap
 dev/netmap/netmap_freebsd.c	optional netmap
 dev/netmap/netmap_generic.c	optional netmap
 dev/netmap/netmap_kloop.c	optional netmap
 dev/netmap/netmap_legacy.c	optional netmap
 dev/netmap/netmap_mbq.c		optional netmap
 dev/netmap/netmap_mem2.c	optional netmap
 dev/netmap/netmap_monitor.c	optional netmap
 dev/netmap/netmap_null.c	optional netmap
 dev/netmap/netmap_offloadings.c	optional netmap
 dev/netmap/netmap_pipe.c	optional netmap
 dev/netmap/netmap_vale.c	optional netmap
 # compile-with "${NORMAL_C} -Wconversion -Wextra"
 dev/nfsmb/nfsmb.c		optional nfsmb pci
 dev/nge/if_nge.c		optional nge
 dev/nmdm/nmdm.c			optional nmdm
 dev/null/null.c			standard
 dev/nvd/nvd.c			optional nvd nvme
 dev/nvme/nvme.c			optional nvme
 dev/nvme/nvme_ahci.c		optional nvme ahci
 dev/nvme/nvme_ctrlr.c		optional nvme
 dev/nvme/nvme_ctrlr_cmd.c	optional nvme
 dev/nvme/nvme_ns.c		optional nvme
 dev/nvme/nvme_ns_cmd.c		optional nvme
 dev/nvme/nvme_pci.c		optional nvme pci
 dev/nvme/nvme_qpair.c		optional nvme
 dev/nvme/nvme_sim.c		optional nvme scbus
 dev/nvme/nvme_sysctl.c		optional nvme
 dev/nvme/nvme_test.c		optional nvme
 dev/nvme/nvme_util.c		optional nvme
 dev/nvmem/nvmem.c		optional nvmem fdt
 dev/nvmem/nvmem_if.m		optional nvmem
 dev/oce/oce_hw.c		optional oce pci
 dev/oce/oce_if.c		optional oce pci
 dev/oce/oce_mbox.c		optional oce pci
 dev/oce/oce_queue.c		optional oce pci
 dev/oce/oce_sysctl.c		optional oce pci
 dev/oce/oce_util.c		optional oce pci
 dev/ocs_fc/ocs_gendump.c	optional ocs_fc pci
 dev/ocs_fc/ocs_pci.c		optional ocs_fc pci
 dev/ocs_fc/ocs_ioctl.c		optional ocs_fc pci
 dev/ocs_fc/ocs_os.c		optional ocs_fc pci
 dev/ocs_fc/ocs_utils.c		optional ocs_fc pci
 dev/ocs_fc/ocs_hw.c		optional ocs_fc pci
 dev/ocs_fc/ocs_hw_queues.c	optional ocs_fc pci
 dev/ocs_fc/sli4.c		optional ocs_fc pci
 dev/ocs_fc/ocs_sm.c		optional ocs_fc pci
 dev/ocs_fc/ocs_device.c		optional ocs_fc pci
 dev/ocs_fc/ocs_xport.c		optional ocs_fc pci
 dev/ocs_fc/ocs_domain.c		optional ocs_fc pci
 dev/ocs_fc/ocs_sport.c		optional ocs_fc pci
 dev/ocs_fc/ocs_els.c		optional ocs_fc pci
 dev/ocs_fc/ocs_fabric.c		optional ocs_fc pci
 dev/ocs_fc/ocs_io.c		optional ocs_fc pci
 dev/ocs_fc/ocs_node.c		optional ocs_fc pci
 dev/ocs_fc/ocs_scsi.c		optional ocs_fc pci
 dev/ocs_fc/ocs_unsol.c		optional ocs_fc pci
 dev/ocs_fc/ocs_ddump.c		optional ocs_fc pci
 dev/ocs_fc/ocs_mgmt.c		optional ocs_fc pci
 dev/ocs_fc/ocs_cam.c		optional ocs_fc pci
 dev/ofw/ofw_bus_if.m		optional fdt
 dev/ofw/ofw_bus_subr.c		optional fdt
 dev/ofw/ofw_cpu.c		optional fdt
 dev/ofw/ofw_fdt.c		optional fdt
 dev/ofw/ofw_firmware.c		optional fdt
 dev/ofw/ofw_if.m		optional fdt
 dev/ofw/ofw_graph.c		optional fdt
 dev/ofw/ofw_subr.c		optional fdt
 dev/ofw/ofwbus.c		optional fdt
 dev/ofw/openfirm.c		optional fdt
 dev/ofw/openfirmio.c		optional fdt
 dev/ow/ow.c			optional ow				\
 	dependency	"owll_if.h"					\
 	dependency	"own_if.h"
 dev/ow/owll_if.m		optional ow
 dev/ow/own_if.m			optional ow
 dev/ow/ow_temp.c		optional ow_temp
 dev/ow/owc_gpiobus.c		optional owc gpio
 dev/pbio/pbio.c			optional pbio isa
 dev/pccbb/pccbb.c		optional cbb
 dev/pccbb/pccbb_pci.c		optional cbb pci
 dev/pcf/pcf.c			optional pcf
 dev/pci/fixup_pci.c		optional pci
 dev/pci/hostb_pci.c		optional pci
 dev/pci/ignore_pci.c		optional pci
 dev/pci/isa_pci.c		optional pci isa
 dev/pci/pci.c			optional pci
 dev/pci/pci_if.m		standard
 dev/pci/pci_iov.c		optional pci pci_iov
 dev/pci/pci_iov_if.m		standard
 dev/pci/pci_iov_schema.c	optional pci pci_iov
 dev/pci/pci_pci.c		optional pci
 dev/pci/pci_subr.c		optional pci
 dev/pci/pci_user.c		optional pci
 dev/pci/pcib_if.m		standard
 dev/pci/pcib_support.c		standard
 dev/pci/vga_pci.c		optional pci
 dev/phy/phy.c			optional phy
 dev/phy/phydev_if.m		optional phy fdt
 dev/phy/phynode_if.m		optional phy
 dev/phy/phy_usb.c		optional phy
 dev/phy/phynode_usb_if.m	optional phy
 dev/pms/freebsd/driver/ini/src/agtiapi.c		optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sallsdk/spc/sadisc.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sallsdk/spc/mpi.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sallsdk/spc/saframe.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sallsdk/spc/sahw.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sallsdk/spc/sainit.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sallsdk/spc/saint.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sallsdk/spc/sampicmd.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sallsdk/spc/sampirsp.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sallsdk/spc/saphy.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sallsdk/spc/saport.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sallsdk/spc/sasata.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sallsdk/spc/sasmp.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sallsdk/spc/sassp.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sallsdk/spc/satimer.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sallsdk/spc/sautil.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sallsdk/spc/saioctlcmd.c		optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sallsdk/spc/mpidebug.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/discovery/dm/dminit.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/discovery/dm/dmsmp.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/discovery/dm/dmdisc.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/discovery/dm/dmport.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/discovery/dm/dmtimer.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/discovery/dm/dmmisc.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sat/src/sminit.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sat/src/smmisc.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sat/src/smsat.c				optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sat/src/smsatcb.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sat/src/smsathw.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/sat/src/smtimer.c			optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/tisa/sassata/common/tdinit.c		optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/tisa/sassata/common/tdmisc.c		optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/tisa/sassata/common/tdesgl.c		optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/tisa/sassata/common/tdport.c		optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/tisa/sassata/common/tdint.c		optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/tisa/sassata/common/tdioctl.c		optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/tisa/sassata/common/tdhw.c		optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/tisa/sassata/common/ossacmnapi.c	optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/tisa/sassata/common/tddmcmnapi.c	optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/tisa/sassata/common/tdsmcmnapi.c	optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/tisa/sassata/common/tdtimers.c		optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/tisa/sassata/sas/ini/itdio.c		optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/tisa/sassata/sas/ini/itdcb.c		optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/tisa/sassata/sas/ini/itdinit.c		optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/tisa/sassata/sas/ini/itddisc.c		optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/tisa/sassata/sata/host/sat.c		optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/tisa/sassata/sata/host/ossasat.c	optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/pms/RefTisa/tisa/sassata/sata/host/sathw.c		optional pmspcv \
 	compile-with "${NORMAL_C} -Wunused-variable -Woverflow -Wparentheses -w"
 dev/ppbus/if_plip.c		optional plip
 dev/ppbus/lpbb.c		optional lpbb
 dev/ppbus/lpt.c			optional lpt
 dev/ppbus/pcfclock.c		optional pcfclock
 dev/ppbus/ppb_1284.c		optional ppbus
 dev/ppbus/ppb_base.c		optional ppbus
 dev/ppbus/ppb_msq.c		optional ppbus
 dev/ppbus/ppbconf.c		optional ppbus
 dev/ppbus/ppbus_if.m		optional ppbus
 dev/ppbus/ppi.c			optional ppi
 dev/ppbus/pps.c			optional pps
 dev/ppc/ppc.c			optional ppc
 dev/ppc/ppc_acpi.c		optional ppc acpi
 dev/ppc/ppc_isa.c		optional ppc isa
 dev/ppc/ppc_pci.c		optional ppc pci
 dev/ppc/ppc_puc.c		optional ppc puc
 dev/proto/proto_bus_isa.c	optional proto acpi | proto isa
 dev/proto/proto_bus_pci.c	optional proto pci
 dev/proto/proto_busdma.c	optional proto
 dev/proto/proto_core.c		optional proto
 dev/pst/pst-iop.c		optional pst
 dev/pst/pst-pci.c		optional pst pci
 dev/pst/pst-raid.c		optional pst
 dev/pty/pty.c			optional pty
 dev/puc/puc.c			optional puc
 dev/puc/puc_cfg.c		optional puc
 dev/puc/puc_pci.c		optional puc pci
 dev/pwm/pwmc.c			optional pwm | pwmc
 dev/pwm/pwmbus.c		optional pwm | pwmbus
 dev/pwm/pwmbus_if.m		optional pwm | pwmbus
 dev/pwm/ofw_pwm.c		optional pwm fdt | pwmbus fdt
 dev/pwm/ofw_pwmbus.c		optional pwm fdt | pwmbus fdt
 dev/pwm/pwm_backlight.c		optional pwm pwm_backlight fdt backlight
 dev/quicc/quicc_core.c		optional quicc
 dev/ral/rt2560.c		optional ral
 dev/ral/rt2661.c		optional ral
 dev/ral/rt2860.c		optional ral
 dev/ral/if_ral_pci.c		optional ral pci
 rt2561fw.c			optional rt2561fw | ralfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk rt2561.fw:rt2561fw -mrt2561 -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"rt2561fw.c"
 rt2561fw.fwo			optional rt2561fw | ralfw		\
 	dependency	"rt2561.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"rt2561fw.fwo"
 rt2561.fw			optional rt2561fw | ralfw		\
 	dependency	"$S/contrib/dev/ral/rt2561.fw.uu"		\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"rt2561.fw"
 rt2561sfw.c			optional rt2561sfw | ralfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk rt2561s.fw:rt2561sfw -mrt2561s -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"rt2561sfw.c"
 rt2561sfw.fwo			optional rt2561sfw | ralfw		\
 	dependency	"rt2561s.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"rt2561sfw.fwo"
 rt2561s.fw			optional rt2561sfw | ralfw		\
 	dependency	"$S/contrib/dev/ral/rt2561s.fw.uu"		\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"rt2561s.fw"
 rt2661fw.c			optional rt2661fw | ralfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk rt2661.fw:rt2661fw -mrt2661 -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"rt2661fw.c"
 rt2661fw.fwo			optional rt2661fw | ralfw		\
 	dependency	"rt2661.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"rt2661fw.fwo"
 rt2661.fw			optional rt2661fw | ralfw		\
 	dependency	"$S/contrib/dev/ral/rt2661.fw.uu"		\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"rt2661.fw"
 rt2860fw.c			optional rt2860fw | ralfw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk rt2860.fw:rt2860fw -mrt2860 -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"rt2860fw.c"
 rt2860fw.fwo			optional rt2860fw | ralfw		\
 	dependency	"rt2860.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"rt2860fw.fwo"
 rt2860.fw			optional rt2860fw | ralfw		\
 	dependency	"$S/contrib/dev/ral/rt2860.fw.uu"		\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"rt2860.fw"
 dev/random/random_infra.c	standard
 dev/random/random_harvestq.c	standard
 dev/random/randomdev.c		optional !random_loadable
 dev/random/fenestrasX/fx_brng.c	optional !random_loadable random_fenestrasx
 dev/random/fenestrasX/fx_main.c	optional !random_loadable random_fenestrasx \
 	compile-with "${NORMAL_C} -I$S/crypto/blake2"
 dev/random/fenestrasX/fx_pool.c	optional !random_loadable random_fenestrasx \
 	compile-with "${NORMAL_C} -I$S/crypto/blake2"
 dev/random/fenestrasX/fx_rng.c	optional !random_loadable random_fenestrasx \
 	compile-with "${NORMAL_C} -I$S/crypto/blake2"
 dev/random/fortuna.c		optional !random_loadable !random_fenestrasx
 dev/random/hash.c		optional !random_loadable
 dev/rccgpio/rccgpio.c		optional rccgpio gpio
 dev/re/if_re.c			optional re
 dev/regulator/regdev_if.m	optional regulator fdt
 dev/regulator/regnode_if.m	optional regulator
 dev/regulator/regulator.c	optional regulator
 dev/regulator/regulator_bus.c	optional regulator fdt
 dev/regulator/regulator_fixed.c	optional regulator
 dev/rl/if_rl.c			optional rl pci
 dev/rndtest/rndtest.c		optional rndtest
 #
 dev/rtsx/rtsx.c			optional rtsx pci
 #
 dev/rtwn/if_rtwn.c		optional rtwn
 dev/rtwn/if_rtwn_beacon.c	optional rtwn
 dev/rtwn/if_rtwn_calib.c	optional rtwn
 dev/rtwn/if_rtwn_cam.c		optional rtwn
 dev/rtwn/if_rtwn_efuse.c	optional rtwn
 dev/rtwn/if_rtwn_fw.c		optional rtwn
 dev/rtwn/if_rtwn_rx.c		optional rtwn
 dev/rtwn/if_rtwn_task.c		optional rtwn
 dev/rtwn/if_rtwn_tx.c		optional rtwn
 #
 dev/rtwn/pci/rtwn_pci_attach.c	optional rtwn_pci pci
 dev/rtwn/pci/rtwn_pci_reg.c	optional rtwn_pci pci
 dev/rtwn/pci/rtwn_pci_rx.c	optional rtwn_pci pci
 dev/rtwn/pci/rtwn_pci_tx.c	optional rtwn_pci pci
 #
 dev/rtwn/usb/rtwn_usb_attach.c	optional rtwn_usb
 dev/rtwn/usb/rtwn_usb_ep.c	optional rtwn_usb
 dev/rtwn/usb/rtwn_usb_reg.c	optional rtwn_usb
 dev/rtwn/usb/rtwn_usb_rx.c	optional rtwn_usb
 dev/rtwn/usb/rtwn_usb_tx.c	optional rtwn_usb
 # RTL8188E
 dev/rtwn/rtl8188e/r88e_beacon.c	optional rtwn
 dev/rtwn/rtl8188e/r88e_calib.c	optional rtwn
 dev/rtwn/rtl8188e/r88e_chan.c	optional rtwn
 dev/rtwn/rtl8188e/r88e_fw.c	optional rtwn
 dev/rtwn/rtl8188e/r88e_init.c	optional rtwn
 dev/rtwn/rtl8188e/r88e_led.c	optional rtwn
 dev/rtwn/rtl8188e/r88e_tx.c	optional rtwn
 dev/rtwn/rtl8188e/r88e_rf.c	optional rtwn
 dev/rtwn/rtl8188e/r88e_rom.c	optional rtwn
 dev/rtwn/rtl8188e/r88e_rx.c	optional rtwn
 dev/rtwn/rtl8188e/pci/r88ee_attach.c	optional rtwn_pci pci
 dev/rtwn/rtl8188e/pci/r88ee_init.c	optional rtwn_pci pci
 dev/rtwn/rtl8188e/pci/r88ee_rx.c	optional rtwn_pci pci
 dev/rtwn/rtl8188e/usb/r88eu_attach.c	optional rtwn_usb
 dev/rtwn/rtl8188e/usb/r88eu_init.c	optional rtwn_usb
 # RTL8192C
 dev/rtwn/rtl8192c/r92c_attach.c	optional rtwn
 dev/rtwn/rtl8192c/r92c_beacon.c	optional rtwn
 dev/rtwn/rtl8192c/r92c_calib.c	optional rtwn
 dev/rtwn/rtl8192c/r92c_chan.c	optional rtwn
 dev/rtwn/rtl8192c/r92c_fw.c	optional rtwn
 dev/rtwn/rtl8192c/r92c_init.c	optional rtwn
 dev/rtwn/rtl8192c/r92c_llt.c	optional rtwn
 dev/rtwn/rtl8192c/r92c_rf.c	optional rtwn
 dev/rtwn/rtl8192c/r92c_rom.c	optional rtwn
 dev/rtwn/rtl8192c/r92c_rx.c	optional rtwn
 dev/rtwn/rtl8192c/r92c_tx.c	optional rtwn
 dev/rtwn/rtl8192c/pci/r92ce_attach.c	optional rtwn_pci pci
 dev/rtwn/rtl8192c/pci/r92ce_calib.c	optional rtwn_pci pci
 dev/rtwn/rtl8192c/pci/r92ce_fw.c	optional rtwn_pci pci
 dev/rtwn/rtl8192c/pci/r92ce_init.c	optional rtwn_pci pci
 dev/rtwn/rtl8192c/pci/r92ce_led.c	optional rtwn_pci pci
 dev/rtwn/rtl8192c/pci/r92ce_rx.c	optional rtwn_pci pci
 dev/rtwn/rtl8192c/pci/r92ce_tx.c	optional rtwn_pci pci
 dev/rtwn/rtl8192c/usb/r92cu_attach.c	optional rtwn_usb
 dev/rtwn/rtl8192c/usb/r92cu_init.c	optional rtwn_usb
 dev/rtwn/rtl8192c/usb/r92cu_led.c	optional rtwn_usb
 dev/rtwn/rtl8192c/usb/r92cu_rx.c	optional rtwn_usb
 dev/rtwn/rtl8192c/usb/r92cu_tx.c	optional rtwn_usb
 # RTL8192E
 dev/rtwn/rtl8192e/r92e_chan.c	optional rtwn
 dev/rtwn/rtl8192e/r92e_fw.c	optional rtwn
 dev/rtwn/rtl8192e/r92e_init.c	optional rtwn
 dev/rtwn/rtl8192e/r92e_led.c	optional rtwn
 dev/rtwn/rtl8192e/r92e_rf.c	optional rtwn
 dev/rtwn/rtl8192e/r92e_rom.c	optional rtwn
 dev/rtwn/rtl8192e/r92e_rx.c	optional rtwn
 dev/rtwn/rtl8192e/usb/r92eu_attach.c	optional rtwn_usb
 dev/rtwn/rtl8192e/usb/r92eu_init.c	optional rtwn_usb
 # RTL8812A
 dev/rtwn/rtl8812a/r12a_beacon.c	optional rtwn
 dev/rtwn/rtl8812a/r12a_calib.c	optional rtwn
 dev/rtwn/rtl8812a/r12a_caps.c	optional rtwn
 dev/rtwn/rtl8812a/r12a_chan.c	optional rtwn
 dev/rtwn/rtl8812a/r12a_fw.c	optional rtwn
 dev/rtwn/rtl8812a/r12a_init.c	optional rtwn
 dev/rtwn/rtl8812a/r12a_led.c	optional rtwn
 dev/rtwn/rtl8812a/r12a_rf.c	optional rtwn
 dev/rtwn/rtl8812a/r12a_rom.c	optional rtwn
 dev/rtwn/rtl8812a/r12a_rx.c	optional rtwn
 dev/rtwn/rtl8812a/r12a_tx.c	optional rtwn
 dev/rtwn/rtl8812a/usb/r12au_attach.c	optional rtwn_usb
 dev/rtwn/rtl8812a/usb/r12au_init.c	optional rtwn_usb
 dev/rtwn/rtl8812a/usb/r12au_rx.c	optional rtwn_usb
 dev/rtwn/rtl8812a/usb/r12au_tx.c	optional rtwn_usb
 # RTL8821A
 dev/rtwn/rtl8821a/r21a_beacon.c	optional rtwn
 dev/rtwn/rtl8821a/r21a_calib.c	optional rtwn
 dev/rtwn/rtl8821a/r21a_chan.c	optional rtwn
 dev/rtwn/rtl8821a/r21a_fw.c	optional rtwn
 dev/rtwn/rtl8821a/r21a_init.c	optional rtwn
 dev/rtwn/rtl8821a/r21a_led.c	optional rtwn
 dev/rtwn/rtl8821a/r21a_rom.c	optional rtwn
 dev/rtwn/rtl8821a/r21a_rx.c	optional rtwn
 dev/rtwn/rtl8821a/usb/r21au_attach.c	optional rtwn_usb
 dev/rtwn/rtl8821a/usb/r21au_dfs.c	optional rtwn_usb
 dev/rtwn/rtl8821a/usb/r21au_init.c	optional rtwn_usb
 rtwn-rtl8188eefw.c		optional rtwn-rtl8188eefw | rtwnfw	\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk rtwn-rtl8188eefw.fw:rtwn-rtl8188eefw:111 -mrtwn-rtl8188eefw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"rtwn-rtl8188eefw.c"
 rtwn-rtl8188eefw.fwo		optional rtwn-rtl8188eefw | rtwnfw	\
 	dependency	"rtwn-rtl8188eefw.fw"				\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"rtwn-rtl8188eefw.fwo"
 rtwn-rtl8188eefw.fw		optional rtwn-rtl8188eefw | rtwnfw	\
 	dependency	"$S/contrib/dev/rtwn/rtwn-rtl8188eefw.fw.uu"	\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"rtwn-rtl8188eefw.fw"
 rtwn-rtl8188eufw.c		optional rtwn-rtl8188eufw | rtwnfw	\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk rtwn-rtl8188eufw.fw:rtwn-rtl8188eufw:111 -mrtwn-rtl8188eufw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"rtwn-rtl8188eufw.c"
 rtwn-rtl8188eufw.fwo		optional rtwn-rtl8188eufw | rtwnfw	\
 	dependency	"rtwn-rtl8188eufw.fw"				\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"rtwn-rtl8188eufw.fwo"
 rtwn-rtl8188eufw.fw		optional rtwn-rtl8188eufw | rtwnfw	\
 	dependency	"$S/contrib/dev/rtwn/rtwn-rtl8188eufw.fw.uu"	\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"rtwn-rtl8188eufw.fw"
 rtwn-rtl8192cfwE.c		optional rtwn-rtl8192cfwE | rtwnfw	\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk rtwn-rtl8192cfwE.fw:rtwn-rtl8192cfwE:111 -mrtwn-rtl8192cfwE -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"rtwn-rtl8192cfwE.c"
 rtwn-rtl8192cfwE.fwo		optional rtwn-rtl8192cfwE | rtwnfw	\
 	dependency	"rtwn-rtl8192cfwE.fw"				\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"rtwn-rtl8192cfwE.fwo"
 rtwn-rtl8192cfwE.fw		optional rtwn-rtl8192cfwE | rtwnfw	\
 	dependency	"$S/contrib/dev/rtwn/rtwn-rtl8192cfwE.fw.uu"	\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"rtwn-rtl8192cfwE.fw"
 rtwn-rtl8192cfwE_B.c		optional rtwn-rtl8192cfwE_B | rtwnfw	\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk rtwn-rtl8192cfwE_B.fw:rtwn-rtl8192cfwE_B:111 -mrtwn-rtl8192cfwE_B -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"rtwn-rtl8192cfwE_B.c"
 rtwn-rtl8192cfwE_B.fwo		optional rtwn-rtl8192cfwE_B | rtwnfw	\
 	dependency	"rtwn-rtl8192cfwE_B.fw"				\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"rtwn-rtl8192cfwE_B.fwo"
 rtwn-rtl8192cfwE_B.fw		optional rtwn-rtl8192cfwE_B | rtwnfw	\
 	dependency	"$S/contrib/dev/rtwn/rtwn-rtl8192cfwE_B.fw.uu"	\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"rtwn-rtl8192cfwE_B.fw"
 rtwn-rtl8192cfwT.c		optional rtwn-rtl8192cfwT | rtwnfw	\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk rtwn-rtl8192cfwT.fw:rtwn-rtl8192cfwT:111 -mrtwn-rtl8192cfwT -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"rtwn-rtl8192cfwT.c"
 rtwn-rtl8192cfwT.fwo		optional rtwn-rtl8192cfwT | rtwnfw	\
 	dependency	"rtwn-rtl8192cfwT.fw"				\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"rtwn-rtl8192cfwT.fwo"
 rtwn-rtl8192cfwT.fw		optional rtwn-rtl8192cfwT | rtwnfw	\
 	dependency	"$S/contrib/dev/rtwn/rtwn-rtl8192cfwT.fw.uu"	\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"rtwn-rtl8192cfwT.fw"
 rtwn-rtl8192cfwU.c		optional rtwn-rtl8192cfwU | rtwnfw	\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk rtwn-rtl8192cfwU.fw:rtwn-rtl8192cfwU:111 -mrtwn-rtl8192cfwU -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"rtwn-rtl8192cfwU.c"
 rtwn-rtl8192cfwU.fwo		optional rtwn-rtl8192cfwU | rtwnfw	\
 	dependency	"rtwn-rtl8192cfwU.fw"				\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"rtwn-rtl8192cfwU.fwo"
 rtwn-rtl8192cfwU.fw		optional rtwn-rtl8192cfwU | rtwnfw	\
 	dependency	"$S/contrib/dev/rtwn/rtwn-rtl8192cfwU.fw.uu"	\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"rtwn-rtl8192cfwU.fw"
 rtwn-rtl8192eufw.c		optional rtwn-rtl8192eufw | rtwnfw	\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk rtwn-rtl8192eufw.fw:rtwn-rtl8192eufw:111 -mrtwn-rtl8192eufw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"rtwn-rtl8192eufw.c"
 rtwn-rtl8192eufw.fwo		optional rtwn-rtl8192eufw | rtwnfw	\
 	dependency	"rtwn-rtl8192eufw.fw"				\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"rtwn-rtl8192eufw.fwo"
 rtwn-rtl8192eufw.fw		optional rtwn-rtl8192eufw | rtwnfw	\
 	dependency	"$S/contrib/dev/rtwn/rtwn-rtl8192eufw.fw.uu"	\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"rtwn-rtl8192eufw.fw"
 rtwn-rtl8812aufw.c		optional rtwn-rtl8812aufw | rtwnfw	\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk rtwn-rtl8812aufw.fw:rtwn-rtl8812aufw:111 -mrtwn-rtl8812aufw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"rtwn-rtl8812aufw.c"
 rtwn-rtl8812aufw.fwo		optional rtwn-rtl8812aufw | rtwnfw	\
 	dependency	"rtwn-rtl8812aufw.fw"				\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"rtwn-rtl8812aufw.fwo"
 rtwn-rtl8812aufw.fw		optional rtwn-rtl8812aufw | rtwnfw	\
 	dependency	"$S/contrib/dev/rtwn/rtwn-rtl8812aufw.fw.uu"	\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"rtwn-rtl8812aufw.fw"
 rtwn-rtl8821aufw.c		optional rtwn-rtl8821aufw | rtwnfw	\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk rtwn-rtl8821aufw.fw:rtwn-rtl8821aufw:111 -mrtwn-rtl8821aufw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"rtwn-rtl8821aufw.c"
 rtwn-rtl8821aufw.fwo		optional rtwn-rtl8821aufw | rtwnfw	\
 	dependency	"rtwn-rtl8821aufw.fw"				\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"rtwn-rtl8821aufw.fwo"
 rtwn-rtl8821aufw.fw		optional rtwn-rtl8821aufw | rtwnfw	\
 	dependency	"$S/contrib/dev/rtwn/rtwn-rtl8821aufw.fw.uu"	\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"rtwn-rtl8821aufw.fw"
 dev/safe/safe.c			optional safe
 dev/scc/scc_if.m		optional scc
 dev/scc/scc_bfe_quicc.c		optional scc quicc
 dev/scc/scc_core.c		optional scc
 dev/scc/scc_dev_quicc.c		optional scc quicc
 dev/scc/scc_dev_z8530.c		optional scc
 dev/sdhci/sdhci.c		optional sdhci
 dev/sdhci/sdhci_fdt.c		optional sdhci fdt regulator clk
 dev/sdhci/sdhci_fdt_gpio.c	optional sdhci fdt gpio
 dev/sdhci/sdhci_fsl_fdt.c	optional sdhci fdt gpio regulator clk
 dev/sdhci/sdhci_if.m		optional sdhci
 dev/sdhci/sdhci_acpi.c		optional sdhci acpi
 dev/sdhci/sdhci_pci.c		optional sdhci pci
 dev/sdio/sdio_if.m		optional mmccam
 dev/sdio/sdio_subr.c		optional mmccam
 dev/sdio/sdiob.c		optional mmccam
 dev/sff/sff_if.m		optional sff
 dev/sff/sfp_fdt.c		optional sff fdt
 dev/sge/if_sge.c		optional sge pci
 dev/siis/siis.c			optional siis pci
 dev/sis/if_sis.c		optional sis pci
 dev/sk/if_sk.c			optional sk pci
 dev/smbios/smbios.c		optional smbios
 dev/smbus/smb.c			optional smb
 dev/smbus/smbconf.c		optional smbus
 dev/smbus/smbus.c		optional smbus
 dev/smbus/smbus_if.m		optional smbus
 dev/smc/if_smc.c		optional smc
 dev/smc/if_smc_acpi.c		optional smc acpi
 dev/smc/if_smc_fdt.c		optional smc fdt
 dev/snp/snp.c			optional snp
-dev/sound/clone.c		optional sound
 dev/sound/unit.c		optional sound
 dev/sound/pci/als4000.c		optional snd_als4000 pci
 dev/sound/pci/atiixp.c		optional snd_atiixp pci
 dev/sound/pci/cmi.c		optional snd_cmi pci
 dev/sound/pci/cs4281.c		optional snd_cs4281 pci
 dev/sound/pci/csa.c		optional snd_csa pci
 dev/sound/pci/csapcm.c		optional snd_csa pci
 dev/sound/pci/emu10k1.c		optional snd_emu10k1 pci
 dev/sound/pci/emu10kx.c		optional snd_emu10kx pci
 dev/sound/pci/emu10kx-pcm.c	optional snd_emu10kx pci
 dev/sound/pci/emu10kx-midi.c	optional snd_emu10kx pci
 dev/sound/pci/envy24.c		optional snd_envy24 pci
 dev/sound/pci/envy24ht.c	optional snd_envy24ht pci
 dev/sound/pci/es137x.c		optional snd_es137x pci
 dev/sound/pci/fm801.c		optional snd_fm801 pci
 dev/sound/pci/ich.c		optional snd_ich pci
 dev/sound/pci/maestro3.c	optional snd_maestro3 pci
 dev/sound/pci/neomagic.c	optional snd_neomagic pci
 dev/sound/pci/solo.c		optional snd_solo pci
 dev/sound/pci/spicds.c		optional snd_spicds pci
 dev/sound/pci/t4dwave.c		optional snd_t4dwave pci
 dev/sound/pci/via8233.c		optional snd_via8233 pci
 dev/sound/pci/via82c686.c	optional snd_via82c686 pci
 dev/sound/pci/vibes.c		optional snd_vibes pci
 dev/sound/pci/hda/hdaa.c	optional snd_hda pci
 dev/sound/pci/hda/hdaa_patches.c	optional snd_hda pci
 dev/sound/pci/hda/hdac.c	optional snd_hda pci
 dev/sound/pci/hda/hdac_if.m	optional snd_hda pci
 dev/sound/pci/hda/hdacc.c	optional snd_hda pci
 dev/sound/pci/hdspe.c		optional snd_hdspe pci
 dev/sound/pci/hdspe-pcm.c	optional snd_hdspe pci
 dev/sound/pcm/ac97.c		optional sound
 dev/sound/pcm/ac97_if.m		optional sound
 dev/sound/pcm/ac97_patch.c	optional sound
 dev/sound/pcm/buffer.c		optional sound	\
 	dependency	"snd_fxdiv_gen.h"
 dev/sound/pcm/channel.c		optional sound
 dev/sound/pcm/channel_if.m	optional sound
 dev/sound/pcm/dsp.c		optional sound
 dev/sound/pcm/feeder.c		optional sound
 dev/sound/pcm/feeder_chain.c	optional sound
 dev/sound/pcm/feeder_eq.c	optional sound	\
 	dependency	"feeder_eq_gen.h"	\
 	dependency	"snd_fxdiv_gen.h"
 dev/sound/pcm/feeder_if.m	optional sound
 dev/sound/pcm/feeder_format.c	optional sound  \
 	dependency	"snd_fxdiv_gen.h"
 dev/sound/pcm/feeder_matrix.c	optional sound  \
 	dependency	"snd_fxdiv_gen.h"
 dev/sound/pcm/feeder_mixer.c	optional sound  \
 	dependency	"snd_fxdiv_gen.h"
 dev/sound/pcm/feeder_rate.c	optional sound	\
 	dependency	"feeder_rate_gen.h"	\
 	dependency	"snd_fxdiv_gen.h"
 dev/sound/pcm/feeder_volume.c	optional sound  \
 	dependency	"snd_fxdiv_gen.h"
 dev/sound/pcm/mixer.c		optional sound
 dev/sound/pcm/mixer_if.m	optional sound
 dev/sound/pcm/sndstat.c		optional sound
 dev/sound/pcm/sound.c		optional sound
 dev/sound/pcm/vchan.c		optional sound
 dev/sound/usb/uaudio.c		optional snd_uaudio usb
 dev/sound/usb/uaudio_pcm.c	optional snd_uaudio usb
 dev/sound/midi/midi.c		optional sound
 dev/sound/midi/mpu401.c		optional sound
 dev/sound/midi/mpu_if.m		optional sound
 dev/sound/midi/mpufoi_if.m	optional sound
 dev/sound/midi/sequencer.c	optional sound
 dev/sound/midi/synth_if.m	optional sound
 dev/spibus/acpi_spibus.c	optional acpi spibus
 dev/spibus/ofw_spibus.c		optional fdt spibus
 dev/spibus/spibus.c		optional spibus				\
 	dependency	"spibus_if.h"
 dev/spibus/spigen.c		optional spigen
 dev/spibus/spibus_if.m		optional spibus
 dev/ste/if_ste.c		optional ste pci
 dev/stge/if_stge.c		optional stge
 dev/sym/sym_hipd.c		optional sym				\
 	dependency	"$S/dev/sym/sym_{conf,defs}.h"
 dev/syscon/syscon.c		optional syscon
 dev/syscon/syscon_generic.c	optional syscon fdt
 dev/syscon/syscon_if.m		optional syscon
 dev/syscon/syscon_power.c	optional syscon syscon_power
 dev/syscons/blank/blank_saver.c	optional blank_saver
 dev/syscons/daemon/daemon_saver.c optional daemon_saver
 dev/syscons/dragon/dragon_saver.c optional dragon_saver
 dev/syscons/fade/fade_saver.c	optional fade_saver
 dev/syscons/fire/fire_saver.c	optional fire_saver
 dev/syscons/green/green_saver.c	optional green_saver
 dev/syscons/logo/logo.c		optional logo_saver
 dev/syscons/logo/logo_saver.c	optional logo_saver
 dev/syscons/rain/rain_saver.c	optional rain_saver
 dev/syscons/schistory.c		optional sc
 dev/syscons/scmouse.c		optional sc
 dev/syscons/scterm.c		optional sc
 dev/syscons/scterm-dumb.c	optional sc !SC_NO_TERM_DUMB
 dev/syscons/scterm-sc.c		optional sc !SC_NO_TERM_SC
 dev/syscons/scterm-teken.c	optional sc !SC_NO_TERM_TEKEN
 dev/syscons/scvidctl.c		optional sc
 dev/syscons/scvtb.c		optional sc
 dev/syscons/snake/snake_saver.c	optional snake_saver
 dev/syscons/star/star_saver.c	optional star_saver
 dev/syscons/syscons.c		optional sc
 dev/syscons/sysmouse.c		optional sc
 dev/syscons/warp/warp_saver.c	optional warp_saver
 dev/tcp_log/tcp_log_dev.c	optional tcp_blackbox inet | tcp_blackbox inet6
 dev/tdfx/tdfx_pci.c		optional tdfx pci
 dev/ti/if_ti.c			optional ti pci
 dev/tws/tws.c			optional tws
 dev/tws/tws_cam.c		optional tws
 dev/tws/tws_hdm.c		optional tws
 dev/tws/tws_services.c		optional tws
 dev/tws/tws_user.c		optional tws
 dev/uart/uart_bus_acpi.c	optional uart acpi
 dev/uart/uart_bus_fdt.c		optional uart fdt
 dev/uart/uart_bus_isa.c		optional uart isa
 dev/uart/uart_bus_pci.c		optional uart pci
 dev/uart/uart_bus_puc.c		optional uart pci
 dev/uart/uart_bus_scc.c		optional uart scc
 dev/uart/uart_core.c		optional uart
 dev/uart/uart_cpu_acpi.c	optional uart acpi
 dev/uart/uart_dbg.c		optional uart gdb
 dev/uart/uart_dev_imx.c		optional uart uart_imx fdt
 dev/uart/uart_dev_msm.c		optional uart uart_msm fdt
 dev/uart/uart_dev_mvebu.c	optional uart uart_mvebu fdt
 dev/uart/uart_dev_ns8250.c	optional uart uart_ns8250 | uart uart_snps
 dev/uart/uart_dev_pl011.c	optional uart pl011
 dev/uart/uart_dev_quicc.c	optional uart quicc
 dev/uart/uart_dev_snps.c	optional uart uart_snps fdt
 dev/uart/uart_dev_z8530.c	optional uart uart_z8530 | uart scc
 dev/uart/uart_if.m		optional uart
 dev/uart/uart_subr.c		optional uart
 dev/uart/uart_tty.c		optional uart
 #
 # USB controller drivers
 #
 dev/usb/controller/musb_otg.c		optional musb
 dev/usb/controller/dwc_otg.c		optional dwcotg
 dev/usb/controller/dwc_otg_fdt.c	optional dwcotg fdt
 dev/usb/controller/dwc_otg_acpi.c	optional dwcotg acpi
 dev/usb/controller/ehci.c		optional ehci
 dev/usb/controller/ehci_msm.c		optional ehci_msm fdt
 dev/usb/controller/ehci_pci.c		optional ehci pci
 dev/usb/controller/ohci.c		optional ohci
 dev/usb/controller/ohci_pci.c		optional ohci pci
 dev/usb/controller/uhci.c		optional uhci
 dev/usb/controller/uhci_pci.c		optional uhci pci
 dev/usb/controller/xhci.c		optional xhci
 dev/usb/controller/xhci_pci.c		optional xhci pci
 dev/usb/controller/saf1761_otg.c	optional saf1761otg
 dev/usb/controller/saf1761_otg_fdt.c	optional saf1761otg fdt
 dev/usb/controller/uss820dci.c		optional uss820dci
 dev/usb/controller/usb_controller.c	optional usb
 #
 # USB storage drivers
 #
 dev/usb/storage/cfumass.c	optional cfumass ctl
 dev/usb/storage/umass.c		optional umass
 dev/usb/storage/urio.c		optional urio
 dev/usb/storage/ustorage_fs.c	optional usfs
 #
 # USB core
 #
 dev/usb/usb_busdma.c		optional usb
 dev/usb/usb_core.c		optional usb
 dev/usb/usb_debug.c		optional usb
 dev/usb/usb_dev.c		optional usb
 dev/usb/usb_device.c		optional usb
 dev/usb/usb_dynamic.c		optional usb
 dev/usb/usb_error.c		optional usb
 dev/usb/usb_fdt_support.c	optional usb fdt
 dev/usb/usb_generic.c		optional usb
 dev/usb/usb_handle_request.c	optional usb
 dev/usb/usb_hid.c		optional usb
 dev/usb/usb_hub.c		optional usb
 dev/usb/usb_hub_acpi.c		optional uacpi acpi
 dev/usb/usb_if.m		optional usb
 dev/usb/usb_lookup.c		optional usb
 dev/usb/usb_mbuf.c		optional usb
 dev/usb/usb_msctest.c		optional usb
 dev/usb/usb_parse.c		optional usb
 dev/usb/usb_pf.c		optional usb
 dev/usb/usb_process.c		optional usb
 dev/usb/usb_request.c		optional usb
 dev/usb/usb_transfer.c		optional usb
 dev/usb/usb_util.c		optional usb
 #
 # USB network drivers
 #
 dev/usb/net/if_aue.c		optional aue
 dev/usb/net/if_axe.c		optional axe
 dev/usb/net/if_axge.c		optional axge
 dev/usb/net/if_cdce.c		optional cdce
 dev/usb/net/if_cdceem.c		optional cdceem
 dev/usb/net/if_cue.c		optional cue
 dev/usb/net/if_ipheth.c		optional ipheth
 dev/usb/net/if_kue.c		optional kue
 dev/usb/net/if_mos.c		optional mos
 dev/usb/net/if_muge.c		optional muge
 dev/usb/net/if_rue.c		optional rue
 dev/usb/net/if_smsc.c		optional smsc
 dev/usb/net/if_udav.c		optional udav
 dev/usb/net/if_ure.c		optional ure
 dev/usb/net/if_usie.c		optional usie
 dev/usb/net/if_urndis.c		optional urndis
 dev/usb/net/ruephy.c		optional rue
 dev/usb/net/usb_ethernet.c	optional uether | aue | axe | axge | cdce | \
 					 cdceem | cue | ipheth | kue | mos | \
 					 rue | smsc | udav | ure | urndis | muge
 dev/usb/net/uhso.c		optional uhso
 #
 # USB WLAN drivers
 #
 dev/usb/wlan/if_rsu.c		optional rsu
 rsu-rtl8712fw.c			optional rsu-rtl8712fw | rsufw		\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk rsu-rtl8712fw.fw:rsu-rtl8712fw:120 -mrsu-rtl8712fw -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"rsu-rtl8712fw.c"
 rsu-rtl8712fw.fwo		optional rsu-rtl8712fw | rsufw		\
 	dependency	"rsu-rtl8712fw.fw"				\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"rsu-rtl8712fw.fwo"
 rsu-rtl8712fw.fw		optional rsu-rtl8712.fw | rsufw		\
 	dependency	"$S/contrib/dev/rsu/rsu-rtl8712fw.fw.uu"	\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"rsu-rtl8712fw.fw"
 dev/usb/wlan/if_rum.c		optional rum
 dev/usb/wlan/if_run.c		optional run
 runfw.c				optional runfw							\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk run.fw:runfw -mrunfw -c${.TARGET}"	\
 	no-ctfconvert no-implicit-rule before-depend local					\
 	clean		"runfw.c"
 runfw.fwo			optional runfw							\
 	dependency	"run.fw"								\
 	compile-with	"${NORMAL_FWO}"								\
 	no-implicit-rule									\
 	clean		"runfw.fwo"
 run.fw				optional runfw							\
 	dependency	"$S/contrib/dev/run/rt2870.fw.uu"					\
 	compile-with	"${NORMAL_FW}"								\
 	no-obj no-implicit-rule									\
 	clean		"run.fw"
 dev/usb/wlan/if_uath.c		optional uath
 dev/usb/wlan/if_upgt.c		optional upgt
 dev/usb/wlan/if_ural.c		optional ural
 dev/usb/wlan/if_urtw.c		optional urtw
 dev/usb/wlan/if_zyd.c		optional zyd
 #
 # USB serial and parallel port drivers
 #
 dev/usb/serial/u3g.c		optional u3g
 dev/usb/serial/uark.c		optional uark
 dev/usb/serial/ubsa.c		optional ubsa
 dev/usb/serial/ubser.c		optional ubser
 dev/usb/serial/uchcom.c		optional uchcom
 dev/usb/serial/ucycom.c		optional ucycom
 dev/usb/serial/ufoma.c		optional ufoma
 dev/usb/serial/uftdi.c		optional uftdi
 dev/usb/serial/ugensa.c		optional ugensa
 dev/usb/serial/uipaq.c		optional uipaq
 dev/usb/serial/ulpt.c		optional ulpt
 dev/usb/serial/umcs.c		optional umcs
 dev/usb/serial/umct.c		optional umct
 dev/usb/serial/umodem.c		optional umodem
 dev/usb/serial/umoscom.c	optional umoscom
 dev/usb/serial/uplcom.c		optional uplcom
 dev/usb/serial/uslcom.c		optional uslcom
 dev/usb/serial/uvisor.c		optional uvisor
 dev/usb/serial/uvscom.c		optional uvscom
 dev/usb/serial/usb_serial.c 	optional ucom | u3g | uark | ubsa | ubser | \
 					 uchcom | ucycom | ufoma | uftdi | \
 					 ugensa | uipaq | umcs | umct | \
 					 umodem | umoscom | uplcom | usie | \
 					 uslcom | uvisor | uvscom
 #
 # USB misc drivers
 #
 dev/usb/misc/cp2112.c		optional cp2112
 dev/usb/misc/udbp.c		optional udbp
 dev/usb/misc/ugold.c		optional ugold
 dev/usb/misc/uled.c		optional uled
 #
 # USB input drivers
 #
 dev/usb/input/atp.c		optional atp
 dev/usb/input/uep.c		optional uep
 dev/usb/input/uhid.c		optional uhid
 dev/usb/input/uhid_snes.c	optional uhid_snes
 dev/usb/input/ukbd.c		optional ukbd
 dev/usb/input/ums.c		optional ums
 dev/usb/input/usbhid.c		optional usbhid
 dev/usb/input/wmt.c		optional wmt
 dev/usb/input/wsp.c		optional wsp
 #
 # USB quirks
 #
 dev/usb/quirk/usb_quirk.c	optional usb
 #
 # USB templates
 #
 dev/usb/template/usb_template.c		optional usb_template
 dev/usb/template/usb_template_audio.c	optional usb_template
 dev/usb/template/usb_template_cdce.c	optional usb_template
 dev/usb/template/usb_template_kbd.c	optional usb_template
 dev/usb/template/usb_template_modem.c	optional usb_template
 dev/usb/template/usb_template_mouse.c	optional usb_template
 dev/usb/template/usb_template_msc.c	optional usb_template
 dev/usb/template/usb_template_mtp.c	optional usb_template
 dev/usb/template/usb_template_phone.c	optional usb_template
 dev/usb/template/usb_template_serialnet.c	optional usb_template
 dev/usb/template/usb_template_midi.c	optional usb_template
 dev/usb/template/usb_template_multi.c	optional usb_template
 dev/usb/template/usb_template_cdceem.c	optional usb_template
 #
 # USB video drivers
 #
 dev/usb/video/udl.c			optional udl
 #
 # USB END
 #
 dev/videomode/videomode.c		optional videomode
 dev/videomode/edid.c			optional videomode
 dev/videomode/pickmode.c		optional videomode
 dev/videomode/vesagtf.c			optional videomode
 dev/veriexec/verified_exec.c	optional mac_veriexec
 dev/vge/if_vge.c		optional vge
 dev/viapm/viapm.c		optional viapm pci
 dev/virtio/virtio.c			optional	virtio
 dev/virtio/virtqueue.c			optional	virtio
 dev/virtio/virtio_bus_if.m		optional	virtio
 dev/virtio/virtio_if.m			optional	virtio
 dev/virtio/pci/virtio_pci.c		optional	virtio_pci
 dev/virtio/pci/virtio_pci_if.m		optional	virtio_pci
 dev/virtio/pci/virtio_pci_legacy.c	optional	virtio_pci
 dev/virtio/pci/virtio_pci_modern.c	optional	virtio_pci
 dev/virtio/mmio/virtio_mmio.c		optional	virtio_mmio
 dev/virtio/mmio/virtio_mmio_acpi.c	optional	virtio_mmio acpi
 dev/virtio/mmio/virtio_mmio_cmdline.c	optional	virtio_mmio
 dev/virtio/mmio/virtio_mmio_fdt.c	optional	virtio_mmio fdt
 dev/virtio/mmio/virtio_mmio_if.m	optional	virtio_mmio
 dev/virtio/network/if_vtnet.c		optional	vtnet
 dev/virtio/block/virtio_blk.c		optional	virtio_blk
 dev/virtio/balloon/virtio_balloon.c	optional	virtio_balloon
 dev/virtio/gpu/virtio_gpu.c		optional	virtio_gpu
 dev/virtio/scsi/virtio_scsi.c		optional	virtio_scsi
 dev/virtio/random/virtio_random.c	optional	virtio_random
 dev/virtio/console/virtio_console.c	optional	virtio_console
 dev/vkbd/vkbd.c			optional vkbd
 dev/vmgenc/vmgenc_acpi.c	optional acpi
 dev/vmware/vmxnet3/if_vmx.c		optional vmx
 dev/vmware/vmci/vmci.c			optional vmci
 dev/vmware/vmci/vmci_datagram.c		optional vmci
 dev/vmware/vmci/vmci_doorbell.c		optional vmci
 dev/vmware/vmci/vmci_driver.c		optional vmci
 dev/vmware/vmci/vmci_event.c		optional vmci
 dev/vmware/vmci/vmci_hashtable.c	optional vmci
 dev/vmware/vmci/vmci_kernel_if.c	optional vmci
 dev/vmware/vmci/vmci_qpair.c		optional vmci
 dev/vmware/vmci/vmci_queue_pair.c	optional vmci
 dev/vmware/vmci/vmci_resource.c		optional vmci
 dev/vmware/pvscsi/pvscsi.c		optional pvscsi
 dev/vr/if_vr.c			optional vr pci
 dev/vt/colors/vt_termcolors.c	optional vt
 dev/vt/font/vt_font_default.c	optional vt
 dev/vt/font/vt_mouse_cursor.c	optional vt
 dev/vt/hw/efifb/efifb.c		optional vt_efifb
 dev/vt/hw/simplefb/simplefb.c	optional vt_simplefb fdt
 dev/vt/hw/vbefb/vbefb.c		optional vt_vbefb
 dev/vt/hw/fb/vt_fb.c		optional vt
 dev/vt/hw/vga/vt_vga.c		optional vt vt_vga
 dev/vt/logo/logo_freebsd.c	optional vt splash
 dev/vt/logo/logo_beastie.c	optional vt splash
 dev/vt/vt_buf.c			optional vt
 dev/vt/vt_consolectl.c		optional vt
 dev/vt/vt_core.c		optional vt
 dev/vt/vt_cpulogos.c		optional vt splash
 dev/vt/vt_font.c		optional vt
 dev/vt/vt_sysmouse.c		optional vt
 dev/vte/if_vte.c		optional vte pci
 dev/watchdog/watchdog.c		standard
 dev/wg/if_wg.c			optional wg				\
 	compile-with "${NORMAL_C} -include $S/dev/wg/compat.h"
 dev/wg/wg_cookie.c		optional wg				\
 	compile-with "${NORMAL_C} -include $S/dev/wg/compat.h"
 dev/wg/wg_crypto.c		optional wg				\
 	compile-with "${NORMAL_C} -include $S/dev/wg/compat.h"
 dev/wg/wg_noise.c		optional wg				\
 	compile-with "${NORMAL_C} -include $S/dev/wg/compat.h"
 dev/wpi/if_wpi.c		optional wpi pci
 wpifw.c			optional wpifw					\
 	compile-with	"${AWK} -f $S/tools/fw_stub.awk wpi.fw:wpifw:153229 -mwpi -c${.TARGET}" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean		"wpifw.c"
 wpifw.fwo			optional wpifw				\
 	dependency	"wpi.fw"					\
 	compile-with	"${NORMAL_FWO}"					\
 	no-implicit-rule						\
 	clean		"wpifw.fwo"
 wpi.fw			optional wpifw					\
 	dependency	"$S/contrib/dev/wpi/iwlwifi-3945-15.32.2.9.fw.uu"	\
 	compile-with	"${NORMAL_FW}"					\
 	no-obj no-implicit-rule						\
 	clean		"wpi.fw"
 dev/xdma/controller/pl330.c	optional xdma pl330 fdt
 dev/xdma/xdma.c			optional xdma
 dev/xdma/xdma_bank.c		optional xdma
 dev/xdma/xdma_bio.c		optional xdma
 dev/xdma/xdma_fdt_test.c	optional xdma xdma_test fdt
 dev/xdma/xdma_if.m		optional xdma
 dev/xdma/xdma_iommu.c		optional xdma
 dev/xdma/xdma_mbuf.c		optional xdma
 dev/xdma/xdma_queue.c		optional xdma
 dev/xdma/xdma_sg.c		optional xdma
 dev/xdma/xdma_sglist.c		optional xdma
 dev/xen/balloon/balloon.c	optional xenhvm
 dev/xen/blkfront/blkfront.c	optional xenhvm
 dev/xen/blkback/blkback.c	optional xenhvm
 dev/xen/bus/xen_intr.c		optional xenhvm
 dev/xen/bus/xenpv.c		optional xenhvm
 dev/xen/console/xen_console.c	optional xenhvm
 dev/xen/control/control.c	optional xenhvm
 dev/xen/cpu/xen_acpi_cpu.c	optional xenhvm acpi
 dev/xen/efi/pvefi.c		optional xenhvm xenefi efirt
 dev/xen/grant_table/grant_table.c	optional xenhvm
 dev/xen/netback/netback.c	optional xenhvm
 dev/xen/netfront/netfront.c	optional xenhvm
 dev/xen/timer/xen_timer.c	optional xenhvm xentimer
 dev/xen/xenpci/xenpci.c		optional xenpci
 dev/xen/xenstore/xenstore.c	optional xenhvm
 dev/xen/xenstore/xenstore_dev.c	optional xenhvm
 dev/xen/xenstore/xenstored_dev.c	optional xenhvm
 dev/xen/evtchn/evtchn_dev.c	optional xenhvm
 dev/xen/privcmd/privcmd.c	optional xenhvm
 dev/xen/gntdev/gntdev.c		optional xenhvm
 dev/xen/debug/debug.c		optional xenhvm
 dev/xl/if_xl.c			optional xl pci
 dev/xl/xlphy.c			optional xl pci
 fs/autofs/autofs.c		optional autofs
 fs/autofs/autofs_vfsops.c	optional autofs
 fs/autofs/autofs_vnops.c	optional autofs
 fs/deadfs/dead_vnops.c		standard
 fs/devfs/devfs_devs.c		standard
 fs/devfs/devfs_dir.c		standard
 fs/devfs/devfs_rule.c		standard
 fs/devfs/devfs_vfsops.c		standard
 fs/devfs/devfs_vnops.c		standard
 fs/fdescfs/fdesc_vfsops.c	optional fdescfs
 fs/fdescfs/fdesc_vnops.c	optional fdescfs
 fs/fifofs/fifo_vnops.c		standard
 fs/cuse/cuse.c			optional cuse
 fs/fuse/fuse_device.c		optional fusefs
 fs/fuse/fuse_file.c		optional fusefs
 fs/fuse/fuse_internal.c		optional fusefs
 fs/fuse/fuse_io.c		optional fusefs
 fs/fuse/fuse_ipc.c		optional fusefs
 fs/fuse/fuse_main.c		optional fusefs
 fs/fuse/fuse_node.c		optional fusefs
 fs/fuse/fuse_vfsops.c		optional fusefs
 fs/fuse/fuse_vnops.c		optional fusefs
 fs/mntfs/mntfs_vnops.c		standard
 fs/msdosfs/msdosfs_conv.c	optional msdosfs
 fs/msdosfs/msdosfs_denode.c	optional msdosfs
 fs/msdosfs/msdosfs_fat.c	optional msdosfs
 fs/msdosfs/msdosfs_iconv.c	optional msdosfs_iconv
 fs/msdosfs/msdosfs_lookup.c	optional msdosfs
 fs/msdosfs/msdosfs_vfsops.c	optional msdosfs
 fs/msdosfs/msdosfs_vnops.c	optional msdosfs
 fs/nfs/nfs_commonkrpc.c		optional nfscl | nfslockd | nfsd
 fs/nfs/nfs_commonsubs.c		optional nfscl | nfslockd | nfsd
 fs/nfs/nfs_commonport.c		optional nfscl | nfslockd | nfsd
 fs/nfs/nfs_commonacl.c		optional nfscl | nfslockd | nfsd
 fs/nfsclient/nfs_clcomsubs.c	optional nfscl
 fs/nfsclient/nfs_clsubs.c	optional nfscl
 fs/nfsclient/nfs_clstate.c	optional nfscl
 fs/nfsclient/nfs_clkrpc.c	optional nfscl
 fs/nfsclient/nfs_clrpcops.c	optional nfscl
 fs/nfsclient/nfs_clvnops.c	optional nfscl
 fs/nfsclient/nfs_clnode.c	optional nfscl
 fs/nfsclient/nfs_clvfsops.c	optional nfscl
 fs/nfsclient/nfs_clport.c	optional nfscl
 fs/nfsclient/nfs_clbio.c	optional nfscl
 fs/nfsclient/nfs_clnfsiod.c	optional nfscl
 fs/nfsserver/nfs_fha_new.c	optional nfsd inet
 fs/nfsserver/nfs_nfsdsocket.c	optional nfsd inet
 fs/nfsserver/nfs_nfsdsubs.c	optional nfsd inet
 fs/nfsserver/nfs_nfsdstate.c	optional nfsd inet
 fs/nfsserver/nfs_nfsdkrpc.c	optional nfsd inet
 fs/nfsserver/nfs_nfsdserv.c	optional nfsd inet
 fs/nfsserver/nfs_nfsdport.c	optional nfsd inet
 fs/nfsserver/nfs_nfsdcache.c	optional nfsd inet
 fs/nullfs/null_subr.c		optional nullfs
 fs/nullfs/null_vfsops.c		optional nullfs
 fs/nullfs/null_vnops.c		optional nullfs
 fs/procfs/procfs.c		optional procfs
 fs/procfs/procfs_dbregs.c	optional procfs
 fs/procfs/procfs_fpregs.c	optional procfs
 fs/procfs/procfs_map.c		optional procfs
 fs/procfs/procfs_mem.c		optional procfs
 fs/procfs/procfs_note.c		optional procfs
 fs/procfs/procfs_osrel.c	optional procfs
 fs/procfs/procfs_regs.c		optional procfs
 fs/procfs/procfs_rlimit.c	optional procfs
 fs/procfs/procfs_status.c	optional procfs
 fs/procfs/procfs_type.c		optional procfs
 fs/pseudofs/pseudofs.c		optional pseudofs
 fs/pseudofs/pseudofs_fileno.c	optional pseudofs
 fs/pseudofs/pseudofs_vncache.c	optional pseudofs
 fs/pseudofs/pseudofs_vnops.c	optional pseudofs
 fs/smbfs/smbfs_io.c		optional smbfs
 fs/smbfs/smbfs_node.c		optional smbfs
 fs/smbfs/smbfs_smb.c		optional smbfs
 fs/smbfs/smbfs_subr.c		optional smbfs
 fs/smbfs/smbfs_vfsops.c		optional smbfs
 fs/smbfs/smbfs_vnops.c		optional smbfs
 fs/tarfs/tarfs_io.c		optional tarfs compile-with "${NORMAL_C} -I$S/contrib/zstd/lib/freebsd"
 fs/tarfs/tarfs_subr.c		optional tarfs
 fs/tarfs/tarfs_vfsops.c		optional tarfs
 fs/tarfs/tarfs_vnops.c		optional tarfs
 fs/udf/osta.c			optional udf
 fs/udf/udf_iconv.c		optional udf_iconv
 fs/udf/udf_vfsops.c		optional udf
 fs/udf/udf_vnops.c		optional udf
 fs/unionfs/union_subr.c		optional unionfs
 fs/unionfs/union_vfsops.c	optional unionfs
 fs/unionfs/union_vnops.c	optional unionfs
 fs/tmpfs/tmpfs_vnops.c		optional tmpfs
 fs/tmpfs/tmpfs_fifoops.c 	optional tmpfs
 fs/tmpfs/tmpfs_vfsops.c 	optional tmpfs
 fs/tmpfs/tmpfs_subr.c 		optional tmpfs
 gdb/gdb_cons.c			optional gdb
 gdb/gdb_main.c			optional gdb
 gdb/gdb_packet.c		optional gdb
 gdb/netgdb.c			optional ddb debugnet gdb netgdb inet
 geom/bde/g_bde.c		optional geom_bde
 geom/bde/g_bde_crypt.c		optional geom_bde
 geom/bde/g_bde_lock.c		optional geom_bde
 geom/bde/g_bde_work.c		optional geom_bde
 geom/cache/g_cache.c		optional geom_cache
 geom/concat/g_concat.c		optional geom_concat
 geom/eli/g_eli.c		optional geom_eli
 geom/eli/g_eli_crypto.c		optional geom_eli
 geom/eli/g_eli_ctl.c		optional geom_eli
 geom/eli/g_eli_hmac.c		optional geom_eli
 geom/eli/g_eli_integrity.c	optional geom_eli
 geom/eli/g_eli_key.c		optional geom_eli
 geom/eli/g_eli_key_cache.c	optional geom_eli
 geom/eli/g_eli_privacy.c	optional geom_eli
 geom/eli/pkcs5v2.c		optional geom_eli
 geom/gate/g_gate.c		optional geom_gate
 geom/geom_bsd_enc.c		optional geom_part_bsd
 geom/geom_ccd.c			optional ccd | geom_ccd
 geom/geom_ctl.c			standard
 geom/geom_dev.c			standard
 geom/geom_disk.c		standard
 geom/geom_dump.c		standard
 geom/geom_event.c		standard
 geom/geom_flashmap.c		optional fdt cfi | fdt mx25l | mmcsd | fdt n25q | fdt at45d
 geom/geom_io.c			standard
 geom/geom_kern.c		standard
 geom/geom_slice.c		standard
 geom/geom_subr.c		standard
 geom/geom_vfs.c			standard
 geom/journal/g_journal.c	optional geom_journal
 geom/journal/g_journal_ufs.c	optional geom_journal
 geom/label/g_label.c		optional geom_label | geom_label_gpt
 geom/label/g_label_ext2fs.c	optional geom_label
 geom/label/g_label_flashmap.c	optional geom_label
 geom/label/g_label_iso9660.c	optional geom_label
 geom/label/g_label_msdosfs.c	optional geom_label
 geom/label/g_label_ntfs.c	optional geom_label
 geom/label/g_label_reiserfs.c	optional geom_label
 geom/label/g_label_ufs.c	optional geom_label
 geom/label/g_label_gpt.c	optional geom_label | geom_label_gpt
 geom/label/g_label_disk_ident.c	optional geom_label
 geom/linux_lvm/g_linux_lvm.c	optional geom_linux_lvm
 geom/mirror/g_mirror.c		optional geom_mirror
 geom/mirror/g_mirror_ctl.c	optional geom_mirror
 geom/mountver/g_mountver.c	optional geom_mountver
 geom/multipath/g_multipath.c	optional geom_multipath
 geom/nop/g_nop.c		optional geom_nop
 geom/part/g_part.c		standard
 geom/part/g_part_if.m		standard
 geom/part/g_part_apm.c		optional geom_part_apm
 geom/part/g_part_bsd.c		optional geom_part_bsd
 geom/part/g_part_bsd64.c	optional geom_part_bsd64
 geom/part/g_part_ebr.c		optional geom_part_ebr
 geom/part/g_part_gpt.c		optional geom_part_gpt
 geom/part/g_part_ldm.c		optional geom_part_ldm
 geom/part/g_part_mbr.c		optional geom_part_mbr
 geom/raid/g_raid.c		optional geom_raid
 geom/raid/g_raid_ctl.c		optional geom_raid
 geom/raid/g_raid_md_if.m	optional geom_raid
 geom/raid/g_raid_tr_if.m	optional geom_raid
 geom/raid/md_ddf.c		optional geom_raid
 geom/raid/md_intel.c		optional geom_raid
 geom/raid/md_jmicron.c		optional geom_raid
 geom/raid/md_nvidia.c		optional geom_raid
 geom/raid/md_promise.c		optional geom_raid
 geom/raid/md_sii.c		optional geom_raid
 geom/raid/tr_concat.c		optional geom_raid
 geom/raid/tr_raid0.c		optional geom_raid
 geom/raid/tr_raid1.c		optional geom_raid
 geom/raid/tr_raid1e.c		optional geom_raid
 geom/raid/tr_raid5.c		optional geom_raid
 geom/raid3/g_raid3.c		optional geom_raid3
 geom/raid3/g_raid3_ctl.c	optional geom_raid3
 geom/shsec/g_shsec.c		optional geom_shsec
 geom/stripe/g_stripe.c		optional geom_stripe
 geom/union/g_union.c		optional geom_union
 geom/uzip/g_uzip.c		optional geom_uzip
 geom/uzip/g_uzip_lzma.c		optional geom_uzip
 geom/uzip/g_uzip_wrkthr.c	optional geom_uzip
 geom/uzip/g_uzip_zlib.c		optional geom_uzip
 geom/uzip/g_uzip_zstd.c		optional geom_uzip zstdio \
 	compile-with "${NORMAL_C} -I$S/contrib/zstd/lib/freebsd"
 geom/vinum/geom_vinum.c		optional geom_vinum
 geom/vinum/geom_vinum_create.c	optional geom_vinum
 geom/vinum/geom_vinum_drive.c	optional geom_vinum
 geom/vinum/geom_vinum_plex.c	optional geom_vinum
 geom/vinum/geom_vinum_volume.c	optional geom_vinum
 geom/vinum/geom_vinum_subr.c	optional geom_vinum
 geom/vinum/geom_vinum_raid5.c	optional geom_vinum
 geom/vinum/geom_vinum_share.c	optional geom_vinum
 geom/vinum/geom_vinum_list.c	optional geom_vinum
 geom/vinum/geom_vinum_rm.c	optional geom_vinum
 geom/vinum/geom_vinum_init.c	optional geom_vinum
 geom/vinum/geom_vinum_state.c	optional geom_vinum
 geom/vinum/geom_vinum_rename.c	optional geom_vinum
 geom/vinum/geom_vinum_move.c	optional geom_vinum
 geom/vinum/geom_vinum_events.c	optional geom_vinum
 geom/virstor/binstream.c	optional geom_virstor
 geom/virstor/g_virstor.c	optional geom_virstor
 geom/virstor/g_virstor_md.c	optional geom_virstor
 geom/zero/g_zero.c		optional geom_zero
 fs/ext2fs/ext2_acl.c		optional ext2fs
 fs/ext2fs/ext2_alloc.c		optional ext2fs
 fs/ext2fs/ext2_balloc.c		optional ext2fs
 fs/ext2fs/ext2_bmap.c		optional ext2fs
 fs/ext2fs/ext2_csum.c		optional ext2fs
 fs/ext2fs/ext2_extattr.c	optional ext2fs
 fs/ext2fs/ext2_extents.c	optional ext2fs
 fs/ext2fs/ext2_inode.c		optional ext2fs
 fs/ext2fs/ext2_inode_cnv.c	optional ext2fs
 fs/ext2fs/ext2_hash.c		optional ext2fs
 fs/ext2fs/ext2_htree.c		optional ext2fs
 fs/ext2fs/ext2_lookup.c		optional ext2fs
 fs/ext2fs/ext2_subr.c		optional ext2fs
 fs/ext2fs/ext2_vfsops.c		optional ext2fs
 fs/ext2fs/ext2_vnops.c		optional ext2fs
 #
 isa/isa_if.m			standard
 isa/isa_common.c		optional isa
 isa/isahint.c			optional isa
 isa/pnp.c			optional isa isapnp
 isa/pnpparse.c			optional isa isapnp
 fs/cd9660/cd9660_bmap.c	optional cd9660
 fs/cd9660/cd9660_lookup.c	optional cd9660
 fs/cd9660/cd9660_node.c	optional cd9660
 fs/cd9660/cd9660_rrip.c	optional cd9660
 fs/cd9660/cd9660_util.c	optional cd9660
 fs/cd9660/cd9660_vfsops.c	optional cd9660
 fs/cd9660/cd9660_vnops.c	optional cd9660
 fs/cd9660/cd9660_iconv.c	optional cd9660_iconv
 gnu/gcov/gcc_4_7.c		optional gcov  \
 	warning "kernel contains GPL licensed gcov support"
 gnu/gcov/gcov_fs.c		optional gcov  lindebugfs \
 	compile-with "${LINUXKPI_C}"
 gnu/gcov/gcov_subr.c		optional gcov
 
 kern/bus_if.m			standard
 kern/clock_if.m			standard
 kern/cpufreq_if.m		standard
 kern/device_if.m		standard
 kern/imgact_binmisc.c		optional imgact_binmisc
 kern/imgact_elf.c		standard
 kern/imgact_elf32.c		optional compat_freebsd32
 kern/imgact_shell.c		standard
 kern/init_main.c		standard
 kern/init_sysent.c		standard
 kern/ksched.c			optional _kposix_priority_scheduling
 kern/kern_acct.c		standard
 kern/kern_alq.c			optional alq
 kern/kern_boottrace.c		standard
 kern/kern_clock.c		standard
 kern/kern_clocksource.c		standard
 kern/kern_condvar.c		standard
 kern/kern_conf.c		standard
 kern/kern_cons.c		standard
 kern/kern_cpu.c			standard
 kern/kern_cpuset.c		standard
 kern/kern_context.c		standard
 kern/kern_descrip.c		standard
 kern/kern_devctl.c		standard
 kern/kern_dtrace.c		optional kdtrace_hooks
 kern/kern_dump.c		standard
 kern/kern_environment.c		standard
 kern/kern_et.c			standard
 kern/kern_event.c		standard
 kern/kern_exec.c		standard
 kern/kern_exit.c		standard
 kern/kern_fail.c		standard
 kern/kern_ffclock.c		standard
 kern/kern_fork.c		standard
 kern/kern_hhook.c		standard
 kern/kern_idle.c		standard
 kern/kern_intr.c		standard
 kern/kern_jail.c		standard
 kern/kern_kcov.c		optional kcov			\
 	compile-with "${NORMAL_C:N-fsanitize*} ${NORMAL_C:M-fsanitize=kernel-memory}"
 kern/kern_khelp.c		standard
 kern/kern_kthread.c		standard
 kern/kern_ktr.c			optional ktr
 kern/kern_ktrace.c		standard
 kern/kern_linker.c		standard
 kern/kern_lock.c		standard
 kern/kern_lockf.c		standard
 kern/kern_lockstat.c		optional kdtrace_hooks
 kern/kern_loginclass.c		standard
 kern/kern_malloc.c		standard
 kern/kern_mbuf.c		standard
 kern/kern_membarrier.c		standard
 kern/kern_mib.c			standard
 kern/kern_module.c		standard
 kern/kern_mtxpool.c		standard
 kern/kern_mutex.c		standard
 kern/kern_ntptime.c		standard
 kern/kern_osd.c			standard
 kern/kern_physio.c		standard
 kern/kern_pmc.c			standard
 kern/kern_poll.c		optional device_polling
 kern/kern_priv.c		standard
 kern/kern_proc.c		standard
 kern/kern_procctl.c		standard
 kern/kern_prot.c		standard
 kern/kern_racct.c		optional racct
 kern/kern_rangelock.c		standard
 kern/kern_rctl.c		standard
 kern/kern_resource.c		standard
 kern/kern_rmlock.c		standard
 kern/kern_rwlock.c		standard
 kern/kern_sdt.c			optional kdtrace_hooks
 kern/kern_sema.c		standard
 kern/kern_sendfile.c		standard
 kern/kern_sharedpage.c		standard
 kern/kern_shutdown.c		standard
 kern/kern_sig.c			standard
 kern/kern_switch.c		standard
 kern/kern_sx.c			standard
 kern/kern_synch.c		standard
 kern/kern_syscalls.c		standard
 kern/kern_sysctl.c		standard
 kern/kern_tc.c			standard
 kern/kern_thr.c			standard
 kern/kern_thread.c		standard
 kern/kern_time.c		standard
 kern/kern_timeout.c		standard
 kern/kern_tslog.c		optional tslog
 kern/kern_ubsan.c		optional kubsan
 kern/kern_umtx.c		standard
 kern/kern_uuid.c		standard
 kern/kern_vnodedumper.c		standard
 kern/kern_xxx.c			standard
 kern/link_elf.c			standard
 kern/linker_if.m		standard
 kern/md4c.c			optional netsmb
 kern/md5c.c			standard
 kern/p1003_1b.c			standard
 kern/posix4_mib.c		standard
 kern/sched_4bsd.c		optional sched_4bsd
 kern/sched_ule.c		optional sched_ule
 kern/serdev_if.m		standard
 kern/stack_protector.c		standard \
 	compile-with "${NORMAL_C:N-fstack-protector*}"
 kern/subr_acl_nfs4.c		optional ufs_acl | zfs
 kern/subr_acl_posix1e.c		optional ufs_acl
 kern/subr_asan.c		optional kasan \
 	compile-with "${NORMAL_C:N-fsanitize*:N-fstack-protector*}"
 kern/subr_autoconf.c		standard
 kern/subr_blist.c		standard
 kern/subr_boot.c		standard
 kern/subr_bus.c			standard
 kern/subr_bus_dma.c		standard
 kern/subr_bufring.c		standard
 kern/subr_capability.c		standard
 kern/subr_clock.c		standard
 kern/subr_compressor.c		standard \
 	compile-with "${NORMAL_C} -I$S/contrib/zstd/lib/freebsd"
 kern/subr_coverage.c		optional coverage \
 	compile-with "${NORMAL_C:N-fsanitize*:N-fno-sanitize*}"
 kern/subr_counter.c		standard
 kern/subr_csan.c		optional kcsan \
 	compile-with "${NORMAL_C:N-fsanitize*:N-fstack-protector*}"
 kern/subr_devstat.c		standard
 kern/subr_disk.c		standard
 kern/subr_early.c		standard
 kern/subr_epoch.c		standard
 kern/subr_eventhandler.c	standard
 kern/subr_fattime.c		standard
 kern/subr_firmware.c		optional firmware
 kern/subr_filter.c		standard
 kern/subr_gtaskqueue.c		standard
 kern/subr_hash.c		standard
 kern/subr_hints.c		standard
 kern/subr_kdb.c			standard
 kern/subr_kobj.c		standard
 kern/subr_lock.c		standard
 kern/subr_log.c			standard
 kern/subr_mchain.c		optional libmchain
 kern/subr_memdesc.c		standard
 kern/subr_module.c		standard
 kern/subr_msan.c		optional kmsan \
 	compile-with "${NORMAL_C:N-fsanitize*:N-fno-sanitize*:N-fstack-protector*}"
 kern/subr_msgbuf.c		standard
 kern/subr_param.c		standard
 kern/subr_pcpu.c		standard
 kern/subr_pctrie.c		standard
 kern/subr_pidctrl.c		standard
 kern/subr_power.c		standard
 kern/subr_prf.c			standard
 kern/subr_prng.c		standard
 kern/subr_prof.c		standard
 kern/subr_rangeset.c		standard
 kern/subr_rman.c		standard
 kern/subr_rtc.c			standard
 kern/subr_sbuf.c		standard
 kern/subr_scanf.c		standard
 kern/subr_sglist.c		standard
 kern/subr_sleepqueue.c		standard
 kern/subr_smp.c			standard
 kern/subr_smr.c			standard
 kern/subr_stack.c		optional ddb | stack | ktr
 kern/subr_stats.c		optional stats
 kern/subr_taskqueue.c		standard
 kern/subr_terminal.c		optional vt
 kern/subr_trap.c		standard
 kern/subr_turnstile.c		standard
 kern/subr_uio.c			standard
 kern/subr_unit.c		standard
 kern/subr_vmem.c		standard
 kern/subr_witness.c		optional witness
 kern/sys_capability.c		standard
 kern/sys_eventfd.c		standard
 kern/sys_generic.c		standard
 kern/sys_getrandom.c		standard
 kern/sys_pipe.c			standard
 kern/sys_procdesc.c		standard
 kern/sys_process.c		standard
 kern/sys_socket.c		standard
 kern/sys_timerfd.c		standard
 kern/syscalls.c			standard
 kern/sysv_ipc.c			standard
 kern/sysv_msg.c			optional sysvmsg
 kern/sysv_sem.c			optional sysvsem
 kern/sysv_shm.c			optional sysvshm
 kern/tty.c			standard
 kern/tty_compat.c		optional compat_43tty
 kern/tty_info.c			standard
 kern/tty_inq.c			standard
 kern/tty_outq.c			standard
 kern/tty_pts.c			standard
 kern/tty_tty.c			standard
 kern/tty_ttydisc.c		standard
 kern/uipc_accf.c		standard
 kern/uipc_debug.c		optional ddb
 kern/uipc_domain.c		standard
 kern/uipc_ktls.c		optional kern_tls
 kern/uipc_mbuf.c		standard
 kern/uipc_mbuf2.c		standard
 kern/uipc_mbufhash.c		standard
 kern/uipc_mqueue.c		optional p1003_1b_mqueue
 kern/uipc_sem.c			optional p1003_1b_semaphores
 kern/uipc_shm.c			standard
 kern/uipc_sockbuf.c		standard
 kern/uipc_socket.c		standard
 kern/uipc_syscalls.c		standard
 kern/uipc_usrreq.c		standard
 kern/vfs_acl.c			standard
 kern/vfs_aio.c			standard
 kern/vfs_bio.c			standard
 kern/vfs_cache.c		standard
 kern/vfs_cluster.c		standard
 kern/vfs_default.c		standard
 kern/vfs_export.c		standard
 kern/vfs_extattr.c		standard
 kern/vfs_hash.c			standard
 kern/vfs_init.c			standard
 kern/vfs_lookup.c		standard
 kern/vfs_mount.c		standard
 kern/vfs_mountroot.c		standard
 kern/vfs_subr.c			standard
 kern/vfs_syscalls.c		standard
 kern/vfs_vnops.c		standard
 #
 # Kernel GSS-API
 #
 gssd.h				optional kgssapi			\
 	dependency		"$S/kgssapi/gssd.x"			\
 	compile-with		"RPCGEN_CPP='${CPP}' rpcgen -hM $S/kgssapi/gssd.x | grep -v pthread.h > gssd.h" \
 	no-obj no-implicit-rule before-depend local			\
 	clean			"gssd.h"
 gssd_xdr.c			optional kgssapi			\
 	dependency		"$S/kgssapi/gssd.x gssd.h"		\
 	compile-with		"RPCGEN_CPP='${CPP}' rpcgen -c $S/kgssapi/gssd.x -o gssd_xdr.c" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean			"gssd_xdr.c"
 gssd_clnt.c			optional kgssapi			\
 	dependency		"$S/kgssapi/gssd.x gssd.h"		\
 	compile-with		"RPCGEN_CPP='${CPP}' rpcgen -lM $S/kgssapi/gssd.x | grep -v string.h > gssd_clnt.c" \
 	no-ctfconvert no-implicit-rule before-depend local		\
 	clean			"gssd_clnt.c"
 kgssapi/gss_accept_sec_context.c optional kgssapi
 kgssapi/gss_add_oid_set_member.c optional kgssapi
 kgssapi/gss_acquire_cred.c	optional kgssapi
 kgssapi/gss_canonicalize_name.c	optional kgssapi
 kgssapi/gss_create_empty_oid_set.c optional kgssapi
 kgssapi/gss_delete_sec_context.c optional kgssapi
 kgssapi/gss_display_status.c	optional kgssapi
 kgssapi/gss_export_name.c	optional kgssapi
 kgssapi/gss_get_mic.c		optional kgssapi
 kgssapi/gss_init_sec_context.c	optional kgssapi
 kgssapi/gss_impl.c		optional kgssapi
 kgssapi/gss_import_name.c	optional kgssapi
 kgssapi/gss_ip_to_dns.c		optional kgssapi
 kgssapi/gss_names.c		optional kgssapi
 kgssapi/gss_pname_to_uid.c	optional kgssapi
 kgssapi/gss_release_buffer.c	optional kgssapi
 kgssapi/gss_release_cred.c	optional kgssapi
 kgssapi/gss_release_name.c	optional kgssapi
 kgssapi/gss_release_oid_set.c	optional kgssapi
 kgssapi/gss_set_cred_option.c	optional kgssapi
 kgssapi/gss_test_oid_set_member.c optional kgssapi
 kgssapi/gss_unwrap.c		optional kgssapi
 kgssapi/gss_verify_mic.c	optional kgssapi
 kgssapi/gss_wrap.c		optional kgssapi
 kgssapi/gss_wrap_size_limit.c	optional kgssapi
 kgssapi/gssd_prot.c		optional kgssapi
 kgssapi/krb5/krb5_mech.c	optional kgssapi
 kgssapi/krb5/kcrypto.c		optional kgssapi
 kgssapi/krb5/kcrypto_aes.c	optional kgssapi
 kgssapi/kgss_if.m		optional kgssapi
 kgssapi/gsstest.c		optional kgssapi_debug
 # These files in libkern/ are those needed by all architectures.  Some
 # of the files in libkern/ are only needed on some architectures, e.g.,
 # libkern/divdi3.c is needed by i386 but not alpha.  Also, some of these
 # routines may be optimized for a particular platform.  In either case,
 # the file should be moved to conf/files.<arch> from here.
 #
 libkern/arc4random.c		standard
 libkern/arc4random_uniform.c	standard
 libkern/asprintf.c		standard
 libkern/bcd.c			standard
 libkern/bsearch.c		standard
 libkern/crc16.c			standard
 libkern/explicit_bzero.c	standard
 libkern/fnmatch.c		standard
 libkern/gsb_crc32.c		standard
 libkern/iconv.c			optional libiconv
 libkern/iconv_converter_if.m	optional libiconv
 libkern/iconv_ucs.c		optional libiconv
 libkern/iconv_xlat.c		optional libiconv
 libkern/iconv_xlat16.c		optional libiconv
 libkern/inet_aton.c		standard
 libkern/inet_ntoa.c		standard
 libkern/inet_ntop.c		standard
 libkern/inet_pton.c		standard
 libkern/jenkins_hash.c		standard
 libkern/murmur3_32.c		standard
 libkern/memcchr.c		standard
 libkern/memchr.c		standard
 libkern/memmem.c		optional gdb
 libkern/qsort.c			standard
 libkern/qsort_r.c		standard
 libkern/random.c		standard
 libkern/scanc.c			standard
 libkern/strcasecmp.c		standard
 libkern/strcasestr.c		standard
 libkern/strcat.c		standard
 libkern/strchr.c		standard
 libkern/strchrnul.c		standard
 libkern/strcpy.c		standard
 libkern/strcspn.c		standard
 libkern/strdup.c		standard
 libkern/strndup.c		standard
 libkern/strlcat.c		standard
 libkern/strlcpy.c		standard
 libkern/strncat.c		standard
 libkern/strncpy.c		standard
 libkern/strnlen.c		standard
 libkern/strnstr.c		standard
 libkern/strrchr.c		standard
 libkern/strsep.c		standard
 libkern/strspn.c		standard
 libkern/strstr.c		standard
 libkern/strtol.c		standard
 libkern/strtoq.c		standard
 libkern/strtoul.c		standard
 libkern/strtouq.c		standard
 libkern/strvalid.c		standard
 libkern/timingsafe_bcmp.c	standard
 contrib/zlib/adler32.c		optional crypto | geom_uzip | \
 	mxge | ddb_ctf | gzio | zfs | zlib \
 	compile-with "${ZLIB_C}"
 contrib/zlib/compress.c		optional crypto | geom_uzip | \
 	mxge | ddb_ctf | gzio | zfs | zlib \
 	compile-with "${ZLIB_C}"
 contrib/zlib/crc32.c		optional crypto | geom_uzip | \
 	mxge | ddb_ctf | gzio | zfs | zlib \
 	compile-with "${ZLIB_C}"
 contrib/zlib/deflate.c		optional crypto | geom_uzip | \
 	mxge | ddb_ctf | gzio | zfs | zlib \
 	compile-with "${ZLIB_C}"
 contrib/zlib/inffast.c		optional crypto | geom_uzip | \
 	mxge | ddb_ctf | gzio | zfs | zlib \
 	compile-with "${ZLIB_C}"
 contrib/zlib/inflate.c		optional crypto | geom_uzip | \
 	mxge | ddb_ctf | gzio | zfs | zlib \
 	compile-with "${ZLIB_C}"
 contrib/zlib/inftrees.c		optional crypto | geom_uzip | \
 	mxge | ddb_ctf | gzio | zfs | zlib \
 	compile-with "${ZLIB_C}"
 contrib/zlib/trees.c		optional crypto | geom_uzip | \
 	mxge | ddb_ctf | gzio | zfs | zlib \
 	compile-with "${ZLIB_C}"
 contrib/zlib/uncompr.c		optional crypto | geom_uzip | \
 	mxge | ddb_ctf | gzio | zfs | zlib \
 	compile-with "${ZLIB_C}"
 contrib/zlib/zutil.c		optional crypto | geom_uzip | \
 	mxge | ddb_ctf | gzio | zfs | zlib \
 	compile-with "${ZLIB_C}"
 dev/zlib/zlib_mod.c		optional crypto | geom_uzip | \
 	mxge | ddb_ctf | gzio | zfs | zlib
 dev/zlib/zcalloc.c		optional crypto | geom_uzip | \
 	mxge | ddb_ctf | gzio | zfs | zlib
 net/altq/altq_cbq.c		optional altq
 net/altq/altq_codel.c		optional altq
 net/altq/altq_hfsc.c		optional altq
 net/altq/altq_fairq.c		optional altq
 net/altq/altq_priq.c		optional altq
 net/altq/altq_red.c		optional altq
 net/altq/altq_rio.c		optional altq
 net/altq/altq_rmclass.c		optional altq
 net/altq/altq_subr.c		optional altq
 net/bpf.c			standard
 net/bpf_buffer.c		optional bpf
 net/bpf_jitter.c		optional bpf_jitter
 net/bpf_filter.c		optional bpf | netgraph_bpf
 net/bpf_zerocopy.c		optional bpf
 net/bridgestp.c			optional bridge | if_bridge
 net/ieee8023ad_lacp.c		optional lagg
 net/if.c			standard
 net/ifq.c			standard
 net/if_bridge.c			optional bridge inet | if_bridge inet
 net/if_clone.c			standard
 net/if_dead.c			standard
 net/if_disc.c			optional disc
 net/if_edsc.c			optional edsc
 net/if_enc.c			optional enc inet | enc inet6
 net/if_epair.c			optional epair
 net/if_ethersubr.c		optional ether
 net/if_fwsubr.c			optional fwip
 net/if_gif.c			optional gif inet | gif inet6 | \
 					 netgraph_gif inet | netgraph_gif inet6
 net/if_gre.c			optional gre inet | gre inet6
 net/if_ipsec.c			optional inet ipsec | inet6 ipsec
 net/if_lagg.c			optional lagg
 net/if_loop.c			optional loop
 net/if_llatbl.c			standard
 net/if_me.c			optional me inet
 net/if_media.c			standard
 net/if_mib.c			standard
 net/if_ovpn.c			optional ovpn inet | ovpn inet6
 net/if_stf.c			optional stf inet inet6
 net/if_tuntap.c			optional tuntap
 net/if_vlan.c			optional vlan
 net/if_vxlan.c			optional vxlan inet | vxlan inet6
 net/ifdi_if.m			optional ether pci iflib
 net/iflib.c			optional ether pci iflib
 net/mp_ring.c			optional ether iflib
 net/mppcc.c			optional netgraph_mppc_compression
 net/mppcd.c			optional netgraph_mppc_compression
 net/netisr.c			standard
 net/debugnet.c			optional inet debugnet
 net/debugnet_inet.c		optional inet debugnet
 net/pfil.c			optional ether | inet
 net/radix.c			standard
 net/route.c			standard
 net/route/nhgrp.c		optional route_mpath
 net/route/nhgrp_ctl.c		optional route_mpath
 net/route/nhop.c		standard
 net/route/nhop_ctl.c		standard
 net/route/nhop_utils.c		standard
 net/route/fib_algo.c		optional fib_algo
 net/route/route_ctl.c		standard
 net/route/route_ddb.c		optional ddb
 net/route/route_helpers.c	standard
 net/route/route_ifaddrs.c	standard
 net/route/route_rtentry.c	standard
 net/route/route_subscription.c	standard
 net/route/route_tables.c	standard
 net/route/route_temporal.c	standard
 net/rss_config.c		optional inet rss | inet6 rss
 net/rtsock.c			standard
 net/slcompress.c		optional netgraph_vjc
 net/toeplitz.c			optional inet rss | inet6 rss | route_mpath
 net/vnet.c			optional vimage
 net80211/ieee80211.c		optional wlan
 net80211/ieee80211_acl.c	optional wlan wlan_acl
 net80211/ieee80211_action.c	optional wlan
 net80211/ieee80211_adhoc.c	optional wlan \
 	compile-with "${NORMAL_C} -Wno-unused-function"
 net80211/ieee80211_ageq.c	optional wlan
 net80211/ieee80211_amrr.c	optional wlan | wlan_amrr
 net80211/ieee80211_crypto.c	optional wlan \
 	compile-with "${NORMAL_C} -Wno-unused-function"
 net80211/ieee80211_crypto_ccmp.c optional wlan wlan_ccmp
 net80211/ieee80211_crypto_none.c optional wlan
 net80211/ieee80211_crypto_tkip.c optional wlan wlan_tkip
 net80211/ieee80211_crypto_wep.c	optional wlan wlan_wep
 net80211/ieee80211_ddb.c	optional wlan ddb
 net80211/ieee80211_dfs.c	optional wlan
 net80211/ieee80211_freebsd.c	optional wlan
 net80211/ieee80211_hostap.c	optional wlan \
 	compile-with "${NORMAL_C} -Wno-unused-function"
 net80211/ieee80211_ht.c		optional wlan
 net80211/ieee80211_hwmp.c	optional wlan ieee80211_support_mesh
 net80211/ieee80211_input.c	optional wlan
 net80211/ieee80211_ioctl.c	optional wlan
 net80211/ieee80211_mesh.c	optional wlan ieee80211_support_mesh \
 	compile-with "${NORMAL_C} -Wno-unused-function"
 net80211/ieee80211_monitor.c	optional wlan
 net80211/ieee80211_node.c	optional wlan
 net80211/ieee80211_output.c	optional wlan
 net80211/ieee80211_phy.c	optional wlan
 net80211/ieee80211_power.c	optional wlan
 net80211/ieee80211_proto.c	optional wlan
 net80211/ieee80211_radiotap.c	optional wlan
 net80211/ieee80211_ratectl.c	optional wlan
 net80211/ieee80211_ratectl_none.c optional wlan
 net80211/ieee80211_regdomain.c	optional wlan
 net80211/ieee80211_rssadapt.c	optional wlan wlan_rssadapt
 net80211/ieee80211_scan.c	optional wlan
 net80211/ieee80211_scan_sta.c	optional wlan
 net80211/ieee80211_sta.c	optional wlan \
 	compile-with "${NORMAL_C} -Wno-unused-function"
 net80211/ieee80211_superg.c	optional wlan ieee80211_support_superg
 net80211/ieee80211_scan_sw.c	optional wlan
 net80211/ieee80211_tdma.c	optional wlan ieee80211_support_tdma
 net80211/ieee80211_vht.c	optional wlan
 net80211/ieee80211_wds.c	optional wlan
 net80211/ieee80211_xauth.c	optional wlan wlan_xauth
 net80211/ieee80211_alq.c	optional wlan ieee80211_alq
 netgraph/bluetooth/common/ng_bluetooth.c optional netgraph_bluetooth
 netgraph/bluetooth/drivers/ubt/ng_ubt.c optional netgraph_bluetooth_ubt usb
 netgraph/bluetooth/drivers/ubt/ng_ubt_intel.c optional netgraph_bluetooth_ubt usb
 netgraph/bluetooth/drivers/ubtbcmfw/ubtbcmfw.c optional netgraph_bluetooth_ubtbcmfw usb
 netgraph/bluetooth/hci/ng_hci_cmds.c optional netgraph_bluetooth_hci
 netgraph/bluetooth/hci/ng_hci_evnt.c optional netgraph_bluetooth_hci
 netgraph/bluetooth/hci/ng_hci_main.c optional netgraph_bluetooth_hci
 netgraph/bluetooth/hci/ng_hci_misc.c optional netgraph_bluetooth_hci
 netgraph/bluetooth/hci/ng_hci_ulpi.c optional netgraph_bluetooth_hci
 netgraph/bluetooth/l2cap/ng_l2cap_cmds.c optional netgraph_bluetooth_l2cap
 netgraph/bluetooth/l2cap/ng_l2cap_evnt.c optional netgraph_bluetooth_l2cap
 netgraph/bluetooth/l2cap/ng_l2cap_llpi.c optional netgraph_bluetooth_l2cap
 netgraph/bluetooth/l2cap/ng_l2cap_main.c optional netgraph_bluetooth_l2cap
 netgraph/bluetooth/l2cap/ng_l2cap_misc.c optional netgraph_bluetooth_l2cap
 netgraph/bluetooth/l2cap/ng_l2cap_ulpi.c optional netgraph_bluetooth_l2cap
 netgraph/bluetooth/socket/ng_btsocket.c optional netgraph_bluetooth_socket
 netgraph/bluetooth/socket/ng_btsocket_hci_raw.c	optional netgraph_bluetooth_socket
 netgraph/bluetooth/socket/ng_btsocket_l2cap.c optional netgraph_bluetooth_socket
 netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c optional netgraph_bluetooth_socket
 netgraph/bluetooth/socket/ng_btsocket_rfcomm.c optional netgraph_bluetooth_socket
 netgraph/bluetooth/socket/ng_btsocket_sco.c optional netgraph_bluetooth_socket
 netgraph/netflow/netflow.c	optional netgraph_netflow
 netgraph/netflow/netflow_v9.c	optional netgraph_netflow
 netgraph/netflow/ng_netflow.c	optional netgraph_netflow
 netgraph/ng_UI.c		optional netgraph_UI
 netgraph/ng_async.c		optional netgraph_async
 netgraph/ng_base.c		optional netgraph
 netgraph/ng_bpf.c		optional netgraph_bpf
 netgraph/ng_bridge.c		optional netgraph_bridge
 netgraph/ng_car.c		optional netgraph_car
 netgraph/ng_checksum.c		optional netgraph_checksum
 netgraph/ng_cisco.c		optional netgraph_cisco
 netgraph/ng_deflate.c		optional netgraph_deflate
 netgraph/ng_device.c		optional netgraph_device
 netgraph/ng_echo.c		optional netgraph_echo
 netgraph/ng_eiface.c		optional netgraph_eiface
 netgraph/ng_ether.c		optional netgraph_ether
 netgraph/ng_ether_echo.c	optional netgraph_ether_echo
 netgraph/ng_frame_relay.c	optional netgraph_frame_relay
 netgraph/ng_gif.c		optional netgraph_gif inet6 | netgraph_gif inet
 netgraph/ng_gif_demux.c		optional netgraph_gif_demux
 netgraph/ng_hole.c		optional netgraph_hole
 netgraph/ng_iface.c		optional netgraph_iface
 netgraph/ng_ip_input.c		optional netgraph_ip_input
 netgraph/ng_ipfw.c		optional netgraph_ipfw inet ipfirewall
 netgraph/ng_ksocket.c		optional netgraph_ksocket
 netgraph/ng_l2tp.c		optional netgraph_l2tp
 netgraph/ng_lmi.c		optional netgraph_lmi
 netgraph/ng_macfilter.c		optional netgraph_macfilter
 netgraph/ng_mppc.c		optional netgraph_mppc_compression | \
 					 netgraph_mppc_encryption
 netgraph/ng_nat.c		optional netgraph_nat inet libalias
 netgraph/ng_one2many.c		optional netgraph_one2many
 netgraph/ng_parse.c		optional netgraph
 netgraph/ng_patch.c		optional netgraph_patch
 netgraph/ng_pipe.c		optional netgraph_pipe
 netgraph/ng_ppp.c		optional netgraph_ppp
 netgraph/ng_pppoe.c		optional netgraph_pppoe
 netgraph/ng_pptpgre.c		optional netgraph_pptpgre
 netgraph/ng_pred1.c		optional netgraph_pred1
 netgraph/ng_rfc1490.c		optional netgraph_rfc1490
 netgraph/ng_socket.c		optional netgraph_socket
 netgraph/ng_split.c		optional netgraph_split
 netgraph/ng_tag.c		optional netgraph_tag
 netgraph/ng_tcpmss.c		optional netgraph_tcpmss
 netgraph/ng_tee.c		optional netgraph_tee
 netgraph/ng_tty.c		optional netgraph_tty
 netgraph/ng_vjc.c		optional netgraph_vjc
 netgraph/ng_vlan.c		optional netgraph_vlan
 netgraph/ng_vlan_rotate.c	optional netgraph_vlan_rotate
 netinet/accf_data.c		optional accept_filter_data inet
 netinet/accf_dns.c		optional accept_filter_dns inet
 netinet/accf_http.c		optional accept_filter_http inet
 netinet/if_ether.c		optional inet ether
 netinet/igmp.c			optional inet
 netinet/in.c			optional inet
 netinet/in_cksum.c		optional inet | inet6
 netinet/in_debug.c		optional inet ddb
 netinet/in_kdtrace.c		optional inet | inet6
 netinet/ip_carp.c		optional inet carp | inet6 carp
 netinet/in_fib.c		optional inet
 netinet/in_fib_algo.c		optional inet fib_algo
 netinet/in_gif.c		optional gif inet | netgraph_gif inet
 netinet/ip_gre.c		optional gre inet
 netinet/ip_id.c			optional inet
 netinet/in_jail.c		optional inet
 netinet/in_mcast.c		optional inet
 netinet/in_pcb.c		optional inet | inet6
 netinet/in_prot.c		optional inet | inet6
 netinet/in_proto.c		optional inet | inet6
 netinet/in_rmx.c		optional inet
 netinet/in_rss.c		optional inet rss
 netinet/ip_divert.c		optional ipdivert inet | ipdivert inet6
 netinet/ip_ecn.c		optional inet | inet6
 netinet/ip_encap.c		optional inet | inet6
 netinet/ip_fastfwd.c		optional inet
 netinet/ip_icmp.c		optional inet | inet6
 netinet/ip_input.c		optional inet
 netinet/ip_mroute.c		optional mrouting inet
 netinet/ip_options.c		optional inet
 netinet/ip_output.c		optional inet
 netinet/ip_reass.c		optional inet
 netinet/raw_ip.c		optional inet | inet6
 netinet/cc/cc.c			optional cc_newreno inet | cc_vegas inet | \
 	cc_htcp inet | cc_hd inet | cc_dctcp inet | cc_cubic inet | \
 	cc_chd inet | cc_cdg inet | cc_newreno inet6 | cc_vegas inet6 | \
 	cc_htcp inet6 | cc_hd inet6 |cc_dctcp inet6 | cc_cubic inet6 | \
 	cc_chd inet6 | cc_cdg inet6
 netinet/cc/cc_cdg.c		optional inet cc_cdg tcp_hhook
 netinet/cc/cc_chd.c		optional inet cc_chd tcp_hhook
 netinet/cc/cc_cubic.c		optional inet cc_cubic | inet6 cc_cubic
 netinet/cc/cc_dctcp.c		optional inet cc_dctcp | inet6 cc_dctcp
 netinet/cc/cc_hd.c		optional inet cc_hd tcp_hhook
 netinet/cc/cc_htcp.c		optional inet cc_htcp | inet6 cc_htcp
 netinet/cc/cc_newreno.c		optional inet cc_newreno | inet6 cc_newreno
 netinet/cc/cc_vegas.c		optional inet cc_vegas tcp_hhook
 netinet/khelp/h_ertt.c		optional inet tcp_hhook
 netinet/sctp_asconf.c		optional inet sctp | inet6 sctp
 netinet/sctp_auth.c		optional inet sctp | inet6 sctp
 netinet/sctp_bsd_addr.c		optional inet sctp | inet6 sctp
 netinet/sctp_cc_functions.c	optional inet sctp | inet6 sctp
 netinet/sctp_crc32.c		optional inet | inet6
 netinet/sctp_indata.c		optional inet sctp | inet6 sctp
 netinet/sctp_input.c		optional inet sctp | inet6 sctp
 netinet/sctp_kdtrace.c		optional inet sctp | inet6 sctp
 netinet/sctp_module.c		optional inet sctp | inet6 sctp
 netinet/sctp_output.c		optional inet sctp | inet6 sctp
 netinet/sctp_pcb.c		optional inet sctp | inet6 sctp
 netinet/sctp_peeloff.c		optional inet sctp | inet6 sctp
 netinet/sctp_ss_functions.c	optional inet sctp | inet6 sctp
 netinet/sctp_syscalls.c		optional inet sctp | inet6 sctp
 netinet/sctp_sysctl.c		optional inet sctp | inet6 sctp
 netinet/sctp_timer.c		optional inet sctp | inet6 sctp
 netinet/sctp_usrreq.c		optional inet sctp | inet6 sctp
 netinet/sctputil.c		optional inet sctp | inet6 sctp
 netinet/siftr.c			optional inet siftr alq | inet6 siftr alq
 netinet/tcp_ecn.c		optional inet | inet6
 netinet/tcp_fastopen.c		optional inet tcp_rfc7413 | inet6 tcp_rfc7413
 netinet/tcp_hostcache.c		optional inet | inet6
 netinet/tcp_input.c		optional inet | inet6
 netinet/tcp_log_buf.c		optional tcp_blackbox inet | tcp_blackbox inet6
 netinet/tcp_lro.c		optional inet | inet6
 netinet/tcp_lro_hpts.c		optional tcphpts inet | tcphpts inet6
 netinet/tcp_output.c		optional inet | inet6
 netinet/tcp_offload.c		optional tcp_offload inet | tcp_offload inet6
 netinet/tcp_hpts.c		optional tcphpts inet | tcphpts inet6
 netinet/tcp_ratelimit.c		optional ratelimit inet | ratelimit inet6
 netinet/tcp_pcap.c		optional inet tcppcap | inet6 tcppcap \
 	compile-with "${NORMAL_C} ${NO_WNONNULL}"
 netinet/tcp_reass.c		optional inet | inet6
 netinet/tcp_sack.c		optional inet | inet6
 netinet/tcp_stacks/bbr.c	optional inet tcphpts tcp_bbr | inet6 tcphpts tcp_bbr \
 	compile-with "${NORMAL_C} -DMODNAME=tcp_bbr -DSTACKNAME=bbr"
 netinet/tcp_stacks/rack.c	optional inet tcphpts tcp_rack | inet6 tcphpts tcp_rack \
 	compile-with "${NORMAL_C} -DMODNAME=tcp_rack -DSTACKNAME=rack"
 netinet/tcp_stacks/rack_bbr_common.c	optional inet tcphpts tcp_bbr | inet tcphpts tcp_rack | inet6 tcphpts tcp_bbr | inet6 tcphpts tcp_rack
 netinet/tcp_stacks/sack_filter.c	optional inet tcphpts tcp_bbr | inet tcphpts tcp_rack | inet6 tcphpts tcp_bbr | inet6 tcphpts tcp_rack
 netinet/tcp_stacks/tailq_hash.c	optional inet tcphpts tcp_bbr | inet tcphpts tcp_rack | inet6 tcphpts tcp_bbr | inet6 tcphpts tcp_rack
 netinet/tcp_stacks/rack_pcm.c	optional inet tcphpts tcp_rack | inet6 tcphpts tcp_rack
 netinet/tcp_stats.c		optional stats inet | stats inet6
 netinet/tcp_subr.c		optional inet | inet6
 netinet/tcp_syncache.c		optional inet | inet6
 netinet/tcp_timer.c		optional inet | inet6
 netinet/tcp_timewait.c		optional inet | inet6
 netinet/tcp_usrreq.c		optional inet | inet6
 netinet/udp_usrreq.c		optional inet | inet6
 netinet/libalias/alias.c	optional libalias inet | netgraph_nat inet
 netinet/libalias/alias_db.c	optional libalias inet | netgraph_nat inet
 netinet/libalias/alias_mod.c	optional libalias | netgraph_nat
 netinet/libalias/alias_proxy.c	optional libalias inet | netgraph_nat inet
 netinet/libalias/alias_util.c	optional libalias inet | netgraph_nat inet
 netinet/libalias/alias_sctp.c	optional libalias inet | netgraph_nat inet
 netinet/netdump/netdump_client.c optional inet debugnet netdump
 netinet6/dest6.c		optional inet6
 netinet6/frag6.c		optional inet6
 netinet6/icmp6.c		optional inet6
 netinet6/in6.c			optional inet6
 netinet6/in6_cksum.c		optional inet6
 netinet6/in6_fib.c		optional inet6
 netinet6/in6_fib_algo.c		optional inet6 fib_algo
 netinet6/in6_gif.c		optional gif inet6 | netgraph_gif inet6
 netinet6/in6_ifattach.c		optional inet6
 netinet6/in6_jail.c		optional inet6
 netinet6/in6_mcast.c		optional inet6
 netinet6/in6_pcb.c		optional inet6
 netinet6/in6_proto.c		optional inet6
 netinet6/in6_rmx.c		optional inet6
 netinet6/in6_rss.c		optional inet6 rss
 netinet6/in6_src.c		optional inet6
 netinet6/ip6_fastfwd.c		optional inet6
 netinet6/ip6_forward.c		optional inet6
 netinet6/ip6_gre.c		optional gre inet6
 netinet6/ip6_id.c		optional inet6
 netinet6/ip6_input.c		optional inet6
 netinet6/ip6_mroute.c		optional mrouting inet6
 netinet6/ip6_output.c		optional inet6
 netinet6/mld6.c			optional inet6
 netinet6/nd6.c			optional inet6
 netinet6/nd6_nbr.c		optional inet6
 netinet6/nd6_rtr.c		optional inet6
 netinet6/raw_ip6.c		optional inet6
 netinet6/route6.c		optional inet6
 netinet6/scope6.c		optional inet6
 netinet6/sctp6_usrreq.c		optional inet6 sctp
 netinet6/udp6_usrreq.c		optional inet6
 netipsec/ipsec.c		optional ipsec inet | ipsec inet6
 netipsec/ipsec_input.c		optional ipsec inet | ipsec inet6
 netipsec/ipsec_mbuf.c		optional ipsec inet | ipsec inet6
 netipsec/ipsec_mod.c		optional ipsec inet | ipsec inet6
 netipsec/ipsec_output.c		optional ipsec inet | ipsec inet6
 netipsec/ipsec_pcb.c		optional ipsec inet | ipsec inet6 | \
 	ipsec_support inet | ipsec_support inet6
 netipsec/key.c			optional ipsec inet | ipsec inet6 | \
 	ipsec_support inet | ipsec_support inet6
 netipsec/key_debug.c		optional ipsec inet | ipsec inet6 | \
 	ipsec_support inet | ipsec_support inet6
 netipsec/keysock.c		optional ipsec inet | ipsec inet6 | \
 	ipsec_support inet | ipsec_support inet6
 netipsec/subr_ipsec.c		optional ipsec inet | ipsec inet6 | \
 	ipsec_support inet | ipsec_support inet6
 netipsec/udpencap.c		optional ipsec inet | ipsec inet6
 netipsec/xform_ah.c		optional ipsec inet | ipsec inet6
 netipsec/xform_esp.c		optional ipsec inet | ipsec inet6
 netipsec/xform_ipcomp.c		optional ipsec inet | ipsec inet6
 netipsec/xform_tcp.c		optional ipsec inet tcp_signature | \
 	 ipsec inet6 tcp_signature | ipsec_support inet tcp_signature | \
 	 ipsec_support inet6 tcp_signature
 netlink/netlink_generic_kpi.c	standard
 netlink/netlink_glue.c		standard
 netlink/netlink_message_parser.c	standard
 netlink/netlink_domain.c	optional netlink
 netlink/netlink_generic.c	optional netlink
 netlink/netlink_io.c		optional netlink
 netlink/netlink_message_writer.c	optional netlink
 netlink/netlink_module.c	optional netlink
 netlink/netlink_route.c		optional netlink
 netlink/route/iface_drivers.c	optional netlink
 netlink/route/iface.c		optional netlink
 netlink/route/neigh.c		optional netlink
 netlink/route/nexthop.c		optional netlink
 netlink/route/rt.c		optional netlink
 netpfil/ipfw/dn_aqm_codel.c	optional inet dummynet
 netpfil/ipfw/dn_aqm_pie.c	optional inet dummynet
 netpfil/ipfw/dn_heap.c		optional inet dummynet
 netpfil/ipfw/dn_sched_fifo.c	optional inet dummynet
 netpfil/ipfw/dn_sched_fq_codel.c	optional inet dummynet
 netpfil/ipfw/dn_sched_fq_pie.c	optional inet dummynet
 netpfil/ipfw/dn_sched_prio.c	optional inet dummynet
 netpfil/ipfw/dn_sched_qfq.c	optional inet dummynet
 netpfil/ipfw/dn_sched_rr.c	optional inet dummynet
 netpfil/ipfw/dn_sched_wf2q.c	optional inet dummynet
 netpfil/ipfw/ip_dummynet.c	optional inet dummynet
 netpfil/ipfw/ip_dn_io.c		optional inet dummynet
 netpfil/ipfw/ip_dn_glue.c	optional inet dummynet
 netpfil/ipfw/ip_fw2.c		optional inet ipfirewall
 netpfil/ipfw/ip_fw_bpf.c	optional inet ipfirewall
 netpfil/ipfw/ip_fw_dynamic.c	optional inet ipfirewall \
 	compile-with "${NORMAL_C} -I$S/contrib/ck/include"
 netpfil/ipfw/ip_fw_eaction.c	optional inet ipfirewall
 netpfil/ipfw/ip_fw_log.c	optional inet ipfirewall
 netpfil/ipfw/ip_fw_pfil.c	optional inet ipfirewall
 netpfil/ipfw/ip_fw_sockopt.c	optional inet ipfirewall
 netpfil/ipfw/ip_fw_table.c	optional inet ipfirewall
 netpfil/ipfw/ip_fw_table_algo.c	optional inet ipfirewall
 netpfil/ipfw/ip_fw_table_value.c	optional inet ipfirewall
 netpfil/ipfw/ip_fw_iface.c	optional inet ipfirewall
 netpfil/ipfw/ip_fw_nat.c	optional inet ipfirewall_nat
 netpfil/ipfw/nat64/ip_fw_nat64.c	optional inet inet6 ipfirewall \
 	ipfirewall_nat64
 netpfil/ipfw/nat64/nat64clat.c	optional inet inet6 ipfirewall \
 	ipfirewall_nat64
 netpfil/ipfw/nat64/nat64clat_control.c	optional inet inet6 ipfirewall \
 	ipfirewall_nat64
 netpfil/ipfw/nat64/nat64lsn.c	optional inet inet6 ipfirewall \
 	ipfirewall_nat64 compile-with "${NORMAL_C} -I$S/contrib/ck/include"
 netpfil/ipfw/nat64/nat64lsn_control.c	optional inet inet6 ipfirewall \
 	ipfirewall_nat64 compile-with "${NORMAL_C} -I$S/contrib/ck/include"
 netpfil/ipfw/nat64/nat64stl.c	optional inet inet6 ipfirewall \
 	ipfirewall_nat64
 netpfil/ipfw/nat64/nat64stl_control.c	optional inet inet6 ipfirewall \
 	ipfirewall_nat64
 netpfil/ipfw/nat64/nat64_translate.c	optional inet inet6 ipfirewall \
 	ipfirewall_nat64
 netpfil/ipfw/nptv6/ip_fw_nptv6.c	optional inet inet6 ipfirewall \
 	ipfirewall_nptv6
 netpfil/ipfw/nptv6/nptv6.c	optional inet inet6 ipfirewall \
 	ipfirewall_nptv6
 netpfil/ipfw/pmod/ip_fw_pmod.c	optional inet ipfirewall_pmod
 netpfil/ipfw/pmod/tcpmod.c	optional inet ipfirewall_pmod
 netpfil/pf/if_pflog.c		optional pflog pf inet
 netpfil/pf/if_pfsync.c		optional pfsync pf inet
 netpfil/pf/pf.c			optional pf inet
 netpfil/pf/pf_if.c		optional pf inet
 netpfil/pf/pf_ioctl.c		optional pf inet
 netpfil/pf/pf_lb.c		optional pf inet
 netpfil/pf/pf_norm.c		optional pf inet
 netpfil/pf/pf_nl.c		optional pf inet
 netpfil/pf/pf_nv.c		optional pf inet
 netpfil/pf/pf_osfp.c		optional pf inet
 netpfil/pf/pf_ruleset.c		optional pf inet
 netpfil/pf/pf_syncookies.c	optional pf inet
 netpfil/pf/pf_table.c		optional pf inet
 netpfil/pf/pflow.c		optional pflow pf inet
 netpfil/pf/pfsync_nv.c		optional pfsync pf inet
 netpfil/pf/in4_cksum.c		optional pf inet
 netsmb/smb_conn.c		optional netsmb
 netsmb/smb_crypt.c		optional netsmb
 netsmb/smb_dev.c		optional netsmb
 netsmb/smb_iod.c		optional netsmb
 netsmb/smb_rq.c			optional netsmb
 netsmb/smb_smb.c		optional netsmb
 netsmb/smb_subr.c		optional netsmb
 netsmb/smb_trantcp.c		optional netsmb
 netsmb/smb_usr.c		optional netsmb
 nfs/bootp_subr.c		optional bootp nfscl
 nfs/krpc_subr.c			optional bootp nfscl
 nfs/nfs_diskless.c		optional nfscl nfs_root
 nfs/nfs_nfssvc.c		optional nfscl | nfslockd | nfsd
 nlm/nlm_advlock.c		optional nfslockd | nfsd
 nlm/nlm_prot_clnt.c		optional nfslockd | nfsd
 nlm/nlm_prot_impl.c		optional nfslockd | nfsd
 nlm/nlm_prot_server.c		optional nfslockd | nfsd
 nlm/nlm_prot_svc.c		optional nfslockd | nfsd
 nlm/nlm_prot_xdr.c		optional nfslockd | nfsd
 nlm/sm_inter_xdr.c		optional nfslockd | nfsd
 
 # Linux Kernel Programming Interface
 compat/linuxkpi/common/src/linux_80211.c	optional compat_linuxkpi wlan \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_80211_macops.c	optional compat_linuxkpi wlan \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_kmod.c		optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_acpi.c		optional compat_linuxkpi acpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_compat.c	optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_current.c	optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_devres.c	optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_dmi.c		optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_domain.c	optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_firmware.c	optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_fpu.c		optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_hrtimer.c	optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_i2c.c		optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_i2cbb.c	optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_interrupt.c	optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_kobject.c	optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_kthread.c	optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_lock.c		optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_mhi.c		optional compat_linuxkpi wlan \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_netdev.c	optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_page.c		optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_pci.c		optional compat_linuxkpi pci \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_tasklet.c	optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_idr.c		optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_radix.c	optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_rcu.c		optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C} -I$S/contrib/ck/include"
 compat/linuxkpi/common/src/linux_schedule.c	optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_shmemfs.c	optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_shrinker.c	optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_skbuff.c	optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_slab.c		optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_usb.c		optional compat_linuxkpi usb \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_work.c		optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_xarray.c	optional compat_linuxkpi \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/lkpi_iic_if.m	optional compat_linuxkpi
 
 compat/linuxkpi/common/src/linux_seq_file.c	optional compat_linuxkpi | lindebugfs \
 	compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_simple_attr.c	optional compat_linuxkpi | lindebugfs \
 	compile-with "${LINUXKPI_C}"
 compat/lindebugfs/lindebugfs.c			optional lindebugfs \
 	compile-with "${LINUXKPI_C}"
 
 # OpenFabrics Enterprise Distribution (Infiniband)
 net/if_infiniband.c					optional ofed | lagg
 ofed/drivers/infiniband/core/ib_addr.c			optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_agent.c			optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_cache.c			optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_cm.c			optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_cma.c			optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_core_uverbs.c		optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_cq.c			optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_device.c		optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_fmr_pool.c		optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_iwcm.c			optional ofed	\
 	compile-with "${OFED_C} ${NO_WUNUSED_BUT_SET_VARIABLE}"
 ofed/drivers/infiniband/core/ib_iwpm_msg.c		optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_iwpm_util.c		optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_mad.c			optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_mad_rmpp.c		optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_multicast.c		optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_packer.c		optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_rdma_core.c		optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_roce_gid_mgmt.c		optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_sa_query.c		optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_smi.c			optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_sysfs.c			optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_ucm.c			optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_ucma.c			optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_ud_header.c		optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_umem.c			optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_user_mad.c		optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_uverbs_cmd.c		optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_uverbs_ioctl.c		optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_uverbs_main.c		optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_uverbs_marshall.c	optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_uverbs_std_types.c	optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_uverbs_std_types_async_fd.c	optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_uverbs_std_types_counters.c	optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_uverbs_std_types_cq.c		optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_uverbs_std_types_device.c	optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_uverbs_std_types_dm.c		optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_uverbs_std_types_flow_action.c	optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_uverbs_std_types_mr.c	optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_uverbs_uapi.c		optional ofed	\
 	compile-with "${OFED_C}"
 ofed/drivers/infiniband/core/ib_verbs.c			optional ofed	\
 	compile-with "${OFED_C}"
 
 ofed/drivers/infiniband/ulp/ipoib/ipoib_cm.c	optional ipoib		\
 	compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/ipoib/"
 #ofed/drivers/infiniband/ulp/ipoib/ipoib_fs.c	optional ipoib		\
 #	compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/ipoib/"
 ofed/drivers/infiniband/ulp/ipoib/ipoib_ib.c	optional ipoib		\
 	compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/ipoib/"
 ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c	optional ipoib		\
 	compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/ipoib/"
 ofed/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	optional ipoib	\
 	compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/ipoib/"
 ofed/drivers/infiniband/ulp/ipoib/ipoib_verbs.c	optional ipoib		\
 	compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/ipoib/"
 #ofed/drivers/infiniband/ulp/ipoib/ipoib_vlan.c	optional ipoib		\
 #	compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/ipoib/"
 
 ofed/drivers/infiniband/ulp/sdp/sdp_bcopy.c	optional sdp inet	\
 	compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/sdp/"
 ofed/drivers/infiniband/ulp/sdp/sdp_main.c	optional sdp inet 	\
 	compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/sdp/"
 ofed/drivers/infiniband/ulp/sdp/sdp_rx.c	optional sdp inet 	\
 	compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/sdp/ ${NO_WUNUSED_BUT_SET_VARIABLE}"
 ofed/drivers/infiniband/ulp/sdp/sdp_cma.c	optional sdp inet 	\
 	compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/sdp/"
 ofed/drivers/infiniband/ulp/sdp/sdp_tx.c	optional sdp inet 	\
 	compile-with "${OFED_C} -I$S/ofed/drivers/infiniband/ulp/sdp/ ${NO_WUNUSED_BUT_SET_VARIABLE}"
 
 dev/irdma/icrdma.c		optional irdma ice inet inet6 pci ofed \
 	compile-with "${OFED_C} -I$S/dev/ice/"
 dev/irdma/irdma_cm.c		optional irdma ice inet inet6 pci ofed \
 	compile-with "${OFED_C} -I$S/dev/ice/"
 dev/irdma/irdma_ctrl.c		optional irdma ice inet inet6 pci ofed \
 	compile-with "${OFED_C} -I$S/dev/ice/"
 dev/irdma/irdma_hmc.c		optional irdma ice inet inet6 pci ofed \
 	compile-with "${OFED_C} -I$S/dev/ice/"
 dev/irdma/irdma_hw.c		optional irdma ice inet inet6 pci ofed \
 	compile-with "${OFED_C} -I$S/dev/ice/"
 dev/irdma/icrdma_hw.c		optional irdma ice inet inet6 pci ofed \
 	compile-with "${OFED_C} -I$S/dev/ice/"
 dev/irdma/fbsd_kcompat.c	optional irdma ice inet inet6 pci ofed \
 	compile-with "${OFED_C} -I$S/dev/ice/"
 dev/irdma/irdma_kcompat.c	optional irdma ice inet inet6 pci ofed \
 	compile-with "${OFED_C} -I$S/dev/ice/"
 dev/irdma/irdma_pble.c		optional irdma ice inet inet6 pci ofed \
 	compile-with "${OFED_C} -I$S/dev/ice/"
 dev/irdma/irdma_puda.c		optional irdma ice inet inet6 pci ofed \
 	compile-with "${OFED_C} -I$S/dev/ice/"
 dev/irdma/irdma_uda.c		optional irdma ice inet inet6 pci ofed \
 	compile-with "${OFED_C} -I$S/dev/ice/"
 dev/irdma/irdma_uk.c		optional irdma ice inet inet6 pci ofed \
 	compile-with "${OFED_C} -I$S/dev/ice/"
 dev/irdma/irdma_utils.c		optional irdma ice inet inet6 pci ofed \
 	compile-with "${OFED_C} -I$S/dev/ice/"
 dev/irdma/irdma_verbs.c		optional irdma ice inet inet6 pci ofed \
 	compile-with "${OFED_C} -I$S/dev/ice/"
 dev/irdma/irdma_ws.c		optional irdma ice inet inet6 pci ofed \
 	compile-with "${OFED_C} -I$S/dev/ice/"
 
 dev/mthca/mthca_allocator.c		optional mthca pci ofed \
 	compile-with "${OFED_C}"
 dev/mthca/mthca_av.c			optional mthca pci ofed \
 	compile-with "${OFED_C}"
 dev/mthca/mthca_catas.c			optional mthca pci ofed \
 	compile-with "${OFED_C}"
 dev/mthca/mthca_cmd.c			optional mthca pci ofed \
 	compile-with "${OFED_C}"
 dev/mthca/mthca_cq.c			optional mthca pci ofed \
 	compile-with "${OFED_C}"
 dev/mthca/mthca_eq.c			optional mthca pci ofed \
 	compile-with "${OFED_C}"
 dev/mthca/mthca_mad.c			optional mthca pci ofed \
 	compile-with "${OFED_C}"
 dev/mthca/mthca_main.c			optional mthca pci ofed \
 	compile-with "${OFED_C}"
 dev/mthca/mthca_mcg.c			optional mthca pci ofed \
 	compile-with "${OFED_C}"
 dev/mthca/mthca_memfree.c		optional mthca pci ofed \
 	compile-with "${OFED_C}"
 dev/mthca/mthca_mr.c			optional mthca pci ofed \
 	compile-with "${OFED_C}"
 dev/mthca/mthca_pd.c			optional mthca pci ofed \
 	compile-with "${OFED_C}"
 dev/mthca/mthca_profile.c		optional mthca pci ofed \
 	compile-with "${OFED_C}"
 dev/mthca/mthca_provider.c		optional mthca pci ofed \
 	compile-with "${OFED_C}"
 dev/mthca/mthca_qp.c			optional mthca pci ofed \
 	compile-with "${OFED_C}"
 dev/mthca/mthca_reset.c			optional mthca pci ofed \
 	compile-with "${OFED_C}"
 dev/mthca/mthca_srq.c			optional mthca pci ofed \
 	compile-with "${OFED_C}"
 dev/mthca/mthca_uar.c			optional mthca pci ofed \
 	compile-with "${OFED_C}"
 
 dev/mlx4/mlx4_ib/mlx4_ib_alias_GUID.c		optional mlx4ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_ib/mlx4_ib_mcg.c			optional mlx4ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_ib/mlx4_ib_sysfs.c		optional mlx4ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_ib/mlx4_ib_cm.c			optional mlx4ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_ib/mlx4_ib_ah.c			optional mlx4ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_ib/mlx4_ib_cq.c			optional mlx4ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_ib/mlx4_ib_doorbell.c		optional mlx4ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_ib/mlx4_ib_mad.c			optional mlx4ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_ib/mlx4_ib_main.c			optional mlx4ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_ib/mlx4_ib_mr.c			optional mlx4ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_ib/mlx4_ib_qp.c			optional mlx4ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_ib/mlx4_ib_srq.c			optional mlx4ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_ib/mlx4_ib_wc.c			optional mlx4ib pci ofed \
 	compile-with "${OFED_C}"
 
 dev/mlx4/mlx4_core/mlx4_alloc.c			optional mlx4 pci \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_core/mlx4_catas.c			optional mlx4 pci \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_core/mlx4_cmd.c			optional mlx4 pci \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_core/mlx4_cq.c			optional mlx4 pci \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_core/mlx4_eq.c			optional mlx4 pci \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_core/mlx4_fw.c			optional mlx4 pci \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_core/mlx4_fw_qos.c		optional mlx4 pci \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_core/mlx4_icm.c			optional mlx4 pci \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_core/mlx4_intf.c			optional mlx4 pci \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_core/mlx4_main.c			optional mlx4 pci \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_core/mlx4_mcg.c			optional mlx4 pci \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_core/mlx4_mr.c			optional mlx4 pci \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_core/mlx4_pd.c			optional mlx4 pci \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_core/mlx4_port.c			optional mlx4 pci \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_core/mlx4_profile.c		optional mlx4 pci \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_core/mlx4_qp.c			optional mlx4 pci \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_core/mlx4_reset.c			optional mlx4 pci \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_core/mlx4_sense.c			optional mlx4 pci \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_core/mlx4_srq.c			optional mlx4 pci \
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_core/mlx4_resource_tracker.c	optional mlx4 pci \
 	compile-with "${OFED_C}"
 
 dev/mlx4/mlx4_en/mlx4_en_cq.c			optional mlx4en pci inet inet6	\
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_en/mlx4_en_main.c			optional mlx4en pci inet inet6	\
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_en/mlx4_en_netdev.c		optional mlx4en pci inet inet6	\
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_en/mlx4_en_port.c			optional mlx4en pci inet inet6	\
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_en/mlx4_en_resources.c		optional mlx4en pci inet inet6	\
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_en/mlx4_en_rx.c			optional mlx4en pci inet inet6	\
 	compile-with "${OFED_C}"
 dev/mlx4/mlx4_en/mlx4_en_tx.c			optional mlx4en pci inet inet6	\
 	compile-with "${OFED_C}"
 
 dev/mlx5/mlx5_ib/mlx5_ib_ah.c			optional mlx5ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_ib/mlx5_ib_cong.c			optional mlx5ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_ib/mlx5_ib_cq.c			optional mlx5ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_ib/mlx5_ib_devx.c			optional mlx5ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_ib/mlx5_ib_doorbell.c		optional mlx5ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_ib/mlx5_ib_gsi.c			optional mlx5ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_ib/mlx5_ib_mad.c			optional mlx5ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_ib/mlx5_ib_main.c			optional mlx5ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_ib/mlx5_ib_mem.c			optional mlx5ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_ib/mlx5_ib_mr.c			optional mlx5ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_ib/mlx5_ib_qp.c			optional mlx5ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_ib/mlx5_ib_srq.c			optional mlx5ib pci ofed \
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_ib/mlx5_ib_virt.c			optional mlx5ib pci ofed \
 	compile-with "${OFED_C}"
 
 dev/mlx5/mlx5_core/mlx5_alloc.c			optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_cmd.c			optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_cq.c			optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_diag_cnt.c		optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_diagnostics.c		optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_eq.c			optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_eswitch.c		optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_fc_cmd.c		optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_fs_cmd.c		optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_fs_counters.c		optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_fs_tcp.c		optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_fs_tree.c		optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_fw.c			optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_fwdump.c		optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_health.c		optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_mad.c			optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_main.c			optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_mcg.c			optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_mpfs.c			optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_mr.c			optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_pagealloc.c		optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_pd.c			optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_port.c			optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_qp.c			optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_rl.c			optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_srq.c			optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_tls.c			optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_transobj.c		optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_uar.c			optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_vport.c			optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_vsc.c			optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_core/mlx5_wq.c			optional mlx5 pci	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_lib/mlx5_gid.c			optional mlx5 pci	\
 	compile-with "${OFED_C}"
 
 dev/mlx5/mlx5_en/mlx5_en_dim.c			optional mlx5en pci inet inet6	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_en/mlx5_en_ethtool.c		optional mlx5en pci inet inet6	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_en/mlx5_en_main.c			optional mlx5en pci inet inet6	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_en/mlx5_en_tx.c			optional mlx5en pci inet inet6	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_en/mlx5_en_flow_table.c		optional mlx5en pci inet inet6	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_en/mlx5_en_hw_tls.c		optional mlx5en pci inet inet6	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_en/mlx5_en_hw_tls_rx.c		optional mlx5en pci inet inet6	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_en/mlx5_en_iq.c			optional mlx5en pci inet inet6	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_en/mlx5_en_rx.c			optional mlx5en pci inet inet6	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_en/mlx5_en_rl.c			optional mlx5en pci inet inet6	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_en/mlx5_en_txrx.c			optional mlx5en pci inet inet6	\
 	compile-with "${OFED_C}"
 dev/mlx5/mlx5_en/mlx5_en_port_buffer.c		optional mlx5en pci inet inet6	\
 	compile-with "${OFED_C}"
 
 # crypto support
 opencrypto/cbc_mac.c		optional crypto
 opencrypto/criov.c		optional crypto
 opencrypto/crypto.c		optional crypto
 opencrypto/cryptodev.c		optional cryptodev
 opencrypto/cryptodev_if.m	optional crypto
 opencrypto/cryptosoft.c		optional crypto
 opencrypto/cryptodeflate.c	optional crypto
 opencrypto/gmac.c		optional crypto
 opencrypto/gfmult.c		optional crypto
 opencrypto/ktls_ocf.c		optional kern_tls
 opencrypto/rmd160.c		optional crypto
 opencrypto/xform_aes_cbc.c	optional crypto
 opencrypto/xform_aes_icm.c	optional crypto
 opencrypto/xform_aes_xts.c	optional crypto
 opencrypto/xform_cbc_mac.c	optional crypto
 opencrypto/xform_chacha20_poly1305.c	optional crypto \
 	compile-with "${NORMAL_C} -I$S/contrib/libsodium/src/libsodium/include -I$S/crypto/libsodium"
 opencrypto/xform_cml.c		optional crypto
 opencrypto/xform_deflate.c	optional crypto
 opencrypto/xform_gmac.c		optional crypto
 opencrypto/xform_null.c		optional crypto
 opencrypto/xform_poly1305.c	optional crypto \
 	compile-with "${NORMAL_C} -I$S/contrib/libsodium/src/libsodium/include -I$S/crypto/libsodium"
 opencrypto/xform_rmd160.c	optional crypto
 opencrypto/xform_sha1.c		optional crypto
 opencrypto/xform_sha2.c		optional crypto
 contrib/libsodium/src/libsodium/crypto_core/ed25519/ref10/ed25519_ref10.c \
 	optional crypto \
 	compile-with "${NORMAL_C} -I$S/contrib/libsodium/src/libsodium/include/sodium -I$S/crypto/libsodium -Wno-unused-function"
 contrib/libsodium/src/libsodium/crypto_core/hchacha20/core_hchacha20.c \
 	optional crypto \
 	compile-with "${NORMAL_C} -I$S/contrib/libsodium/src/libsodium/include/sodium -I$S/crypto/libsodium"
 contrib/libsodium/src/libsodium/crypto_onetimeauth/poly1305/onetimeauth_poly1305.c \
 	optional crypto \
 	compile-with "${NORMAL_C} -I$S/contrib/libsodium/src/libsodium/include/sodium -I$S/crypto/libsodium"
 contrib/libsodium/src/libsodium/crypto_onetimeauth/poly1305/donna/poly1305_donna.c \
 	optional crypto \
 	compile-with "${NORMAL_C} -I$S/contrib/libsodium/src/libsodium/include/sodium -I$S/crypto/libsodium"
 contrib/libsodium/src/libsodium/crypto_scalarmult/curve25519/scalarmult_curve25519.c \
 	optional crypto \
 	compile-with "${NORMAL_C} -I$S/contrib/libsodium/src/libsodium/include/sodium -I$S/crypto/libsodium"
 contrib/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/x25519_ref10.c \
 	optional crypto \
 	compile-with "${NORMAL_C} -I$S/contrib/libsodium/src/libsodium/include/sodium -I$S/crypto/libsodium -Wno-unused-function"
 contrib/libsodium/src/libsodium/crypto_stream/chacha20/stream_chacha20.c \
 	optional crypto \
 	compile-with "${NORMAL_C} -I$S/contrib/libsodium/src/libsodium/include/sodium -I$S/crypto/libsodium"
 contrib/libsodium/src/libsodium/crypto_stream/chacha20/ref/chacha20_ref.c \
 	optional crypto \
 	compile-with "${NORMAL_C} -I$S/contrib/libsodium/src/libsodium/include/sodium -I$S/crypto/libsodium"
 contrib/libsodium/src/libsodium/crypto_verify/sodium/verify.c \
 	optional crypto \
 	compile-with "${NORMAL_C} -I$S/contrib/libsodium/src/libsodium/include/sodium -I$S/crypto/libsodium"
 crypto/libsodium/randombytes.c	optional crypto \
 	compile-with "${NORMAL_C} -I$S/contrib/libsodium/src/libsodium/include -I$S/crypto/libsodium"
 crypto/libsodium/utils.c	optional crypto \
 	compile-with "${NORMAL_C} -I$S/contrib/libsodium/src/libsodium/include -I$S/crypto/libsodium"
 
 rpc/auth_none.c			optional krpc | nfslockd | nfscl | nfsd
 rpc/auth_unix.c			optional krpc | nfslockd | nfscl | nfsd
 rpc/authunix_prot.c		optional krpc | nfslockd | nfscl | nfsd
 rpc/clnt_bck.c			optional krpc | nfslockd | nfscl | nfsd
 rpc/clnt_dg.c			optional krpc | nfslockd | nfscl | nfsd
 rpc/clnt_rc.c			optional krpc | nfslockd | nfscl | nfsd
 rpc/clnt_vc.c			optional krpc | nfslockd | nfscl | nfsd
 rpc/getnetconfig.c		optional krpc | nfslockd | nfscl | nfsd
 rpc/replay.c			optional krpc | nfslockd | nfscl | nfsd
 rpc/rpc_callmsg.c		optional krpc | nfslockd | nfscl | nfsd
 rpc/rpc_generic.c		optional krpc | nfslockd | nfscl | nfsd
 rpc/rpc_prot.c			optional krpc | nfslockd | nfscl | nfsd
 rpc/rpcb_clnt.c			optional krpc | nfslockd | nfscl | nfsd
 rpc/rpcb_prot.c			optional krpc | nfslockd | nfscl | nfsd
 rpc/svc.c			optional krpc | nfslockd | nfscl | nfsd
 rpc/svc_auth.c			optional krpc | nfslockd | nfscl | nfsd
 rpc/svc_auth_unix.c		optional krpc | nfslockd | nfscl | nfsd
 rpc/svc_dg.c			optional krpc | nfslockd | nfscl | nfsd
 rpc/svc_generic.c		optional krpc | nfslockd | nfscl | nfsd
 rpc/svc_vc.c			optional krpc | nfslockd | nfscl | nfsd
 #
 # Kernel RPC-over-TLS
 #
 rpctlscd.h			optional krpc | nfslockd | nfscl | nfsd	\
 	dependency		"$S/rpc/rpcsec_tls/rpctlscd.x"			\
 	compile-with		"RPCGEN_CPP='${CPP}' rpcgen -hM $S/rpc/rpcsec_tls/rpctlscd.x | grep -v pthread.h > rpctlscd.h" \
 	no-obj no-implicit-rule before-depend local			\
 	clean			"rpctlscd.h"
 rpctlscd_xdr.c			optional krpc | nfslockd | nfscl | nfsd	\
 	dependency		"$S/rpc/rpcsec_tls/rpctlscd.x rpctlscd.h"		\
 	compile-with		"RPCGEN_CPP='${CPP}' rpcgen -c $S/rpc/rpcsec_tls/rpctlscd.x -o rpctlscd_xdr.c" no-ctfconvert \
 	no-implicit-rule before-depend local				\
 	clean			"rpctlscd_xdr.c"
 rpctlscd_clnt.c			optional krpc | nfslockd | nfscl | nfsd	\
 	dependency		"$S/rpc/rpcsec_tls/rpctlscd.x rpctlscd.h"		\
 	compile-with		"RPCGEN_CPP='${CPP}' rpcgen -lM $S/rpc/rpcsec_tls/rpctlscd.x | grep -v string.h > rpctlscd_clnt.c" no-ctfconvert \
 	no-implicit-rule before-depend local				\
 	clean			"rpctlscd_clnt.c"
 rpctlssd.h			optional krpc | nfslockd | nfscl | nfsd	\
 	dependency		"$S/rpc/rpcsec_tls/rpctlssd.x"			\
 	compile-with		"RPCGEN_CPP='${CPP}' rpcgen -hM $S/rpc/rpcsec_tls/rpctlssd.x | grep -v pthread.h > rpctlssd.h" \
 	no-obj no-implicit-rule before-depend local			\
 	clean			"rpctlssd.h"
 rpctlssd_xdr.c			optional krpc | nfslockd | nfscl | nfsd	\
 	dependency		"$S/rpc/rpcsec_tls/rpctlssd.x rpctlssd.h"		\
 	compile-with		"RPCGEN_CPP='${CPP}' rpcgen -c $S/rpc/rpcsec_tls/rpctlssd.x -o rpctlssd_xdr.c" no-ctfconvert \
 	no-implicit-rule before-depend local				\
 	clean			"rpctlssd_xdr.c"
 rpctlssd_clnt.c			optional krpc | nfslockd | nfscl | nfsd	\
 	dependency		"$S/rpc/rpcsec_tls/rpctlssd.x rpctlssd.h"		\
 	compile-with		"RPCGEN_CPP='${CPP}' rpcgen -lM $S/rpc/rpcsec_tls/rpctlssd.x | grep -v string.h > rpctlssd_clnt.c" no-ctfconvert \
 	no-implicit-rule before-depend local				\
 	clean			"rpctlssd_clnt.c"
 rpc/rpcsec_tls/rpctls_impl.c	optional krpc | nfslockd | nfscl | nfsd
 rpc/rpcsec_tls/auth_tls.c	optional krpc | nfslockd | nfscl | nfsd
 rpc/rpcsec_gss/rpcsec_gss.c	optional krpc kgssapi | nfslockd kgssapi | nfscl kgssapi | nfsd kgssapi
 rpc/rpcsec_gss/rpcsec_gss_conf.c optional krpc kgssapi | nfslockd kgssapi | nfscl kgssapi | nfsd kgssapi
 rpc/rpcsec_gss/rpcsec_gss_misc.c optional krpc kgssapi | nfslockd kgssapi | nfscl kgssapi | nfsd kgssapi
 rpc/rpcsec_gss/rpcsec_gss_prot.c optional krpc kgssapi | nfslockd kgssapi | nfscl kgssapi | nfsd kgssapi
 rpc/rpcsec_gss/svc_rpcsec_gss.c	optional krpc kgssapi | nfslockd kgssapi | nfscl kgssapi | nfsd kgssapi
 security/audit/audit.c		optional audit
 security/audit/audit_arg.c	optional audit
 security/audit/audit_bsm.c	optional audit
 security/audit/audit_bsm_db.c	optional audit
 security/audit/audit_bsm_klib.c	optional audit
 security/audit/audit_dtrace.c	optional dtaudit audit | dtraceall audit compile-with "${CDDL_C}"
 security/audit/audit_pipe.c	optional audit
 security/audit/audit_syscalls.c	standard
 security/audit/audit_trigger.c	optional audit
 security/audit/audit_worker.c	optional audit
 security/audit/bsm_domain.c	optional audit
 security/audit/bsm_errno.c	optional audit
 security/audit/bsm_fcntl.c	optional audit
 security/audit/bsm_socket_type.c	optional audit
 security/audit/bsm_token.c	optional audit
 security/mac/mac_audit.c	optional mac audit
 security/mac/mac_cred.c		optional mac
 security/mac/mac_kdb.c		optional mac
 security/mac/mac_framework.c	optional mac
 security/mac/mac_inet.c		optional mac inet | mac inet6
 security/mac/mac_inet6.c	optional mac inet6
 security/mac/mac_label.c	optional mac
 security/mac/mac_net.c		optional mac
 security/mac/mac_pipe.c		optional mac
 security/mac/mac_posix_sem.c	optional mac
 security/mac/mac_posix_shm.c	optional mac
 security/mac/mac_priv.c		optional mac
 security/mac/mac_process.c	optional mac
 security/mac/mac_socket.c	optional mac
 security/mac/mac_syscalls.c	standard
 security/mac/mac_system.c	optional mac
 security/mac/mac_sysv_msg.c	optional mac
 security/mac/mac_sysv_sem.c	optional mac
 security/mac/mac_sysv_shm.c	optional mac
 security/mac/mac_vfs.c		optional mac
 security/mac_biba/mac_biba.c	optional mac_biba
 security/mac_ddb/mac_ddb.c	optional mac_ddb
 security/mac_bsdextended/mac_bsdextended.c	optional mac_bsdextended
 security/mac_bsdextended/ugidfw_system.c	optional mac_bsdextended
 security/mac_bsdextended/ugidfw_vnode.c		optional mac_bsdextended
 security/mac_ifoff/mac_ifoff.c	optional mac_ifoff
 security/mac_ipacl/mac_ipacl.c	optional mac_ipacl
 security/mac_lomac/mac_lomac.c	optional mac_lomac
 security/mac_mls/mac_mls.c	optional mac_mls
 security/mac_none/mac_none.c	optional mac_none
 security/mac_ntpd/mac_ntpd.c	optional mac_ntpd
 security/mac_partition/mac_partition.c optional mac_partition
 security/mac_portacl/mac_portacl.c optional mac_portacl
 security/mac_priority/mac_priority.c	optional mac_priority
 security/mac_seeotheruids/mac_seeotheruids.c optional mac_seeotheruids
 security/mac_stub/mac_stub.c	optional mac_stub
 security/mac_test/mac_test.c	optional mac_test
 security/mac_grantbylabel/mac_grantbylabel.c		optional mac_grantbylabel
 security/mac_veriexec/mac_veriexec.c			optional mac_veriexec
 security/mac_veriexec/veriexec_fingerprint.c		optional mac_veriexec
 security/mac_veriexec/veriexec_metadata.c		optional mac_veriexec
 security/mac_veriexec_parser/mac_veriexec_parser.c	optional mac_veriexec mac_veriexec_parser
 security/mac_veriexec/mac_veriexec_rmd160.c		optional mac_veriexec_rmd160
 security/mac_veriexec/mac_veriexec_sha1.c		optional mac_veriexec_sha1
 security/mac_veriexec/mac_veriexec_sha256.c		optional mac_veriexec_sha256
 security/mac_veriexec/mac_veriexec_sha384.c		optional mac_veriexec_sha384
 security/mac_veriexec/mac_veriexec_sha512.c		optional mac_veriexec_sha512
 teken/teken.c			optional sc !SC_NO_TERM_TEKEN | vt
 ufs/ffs/ffs_alloc.c		optional ffs
 ufs/ffs/ffs_balloc.c		optional ffs
 ufs/ffs/ffs_inode.c		optional ffs
 ufs/ffs/ffs_snapshot.c		optional ffs
 ufs/ffs/ffs_softdep.c		optional ffs
 ufs/ffs/ffs_subr.c		optional ffs | geom_label
 ufs/ffs/ffs_tables.c		optional ffs | geom_label
 ufs/ffs/ffs_vfsops.c		optional ffs
 ufs/ffs/ffs_vnops.c		optional ffs
 ufs/ffs/ffs_rawread.c		optional ffs directio
 ufs/ffs/ffs_suspend.c		optional ffs
 ufs/ufs/ufs_acl.c		optional ffs
 ufs/ufs/ufs_bmap.c		optional ffs
 ufs/ufs/ufs_dirhash.c		optional ffs
 ufs/ufs/ufs_extattr.c		optional ffs
 ufs/ufs/ufs_gjournal.c		optional ffs UFS_GJOURNAL
 ufs/ufs/ufs_inode.c		optional ffs
 ufs/ufs/ufs_lookup.c		optional ffs
 ufs/ufs/ufs_quota.c		optional ffs
 ufs/ufs/ufs_vfsops.c		optional ffs
 ufs/ufs/ufs_vnops.c		optional ffs
 vm/device_pager.c		standard
 vm/phys_pager.c			standard
 vm/redzone.c			optional DEBUG_REDZONE
 vm/sg_pager.c			standard
 vm/swap_pager.c			standard
 vm/uma_core.c			standard
 vm/uma_dbg.c			standard
 vm/memguard.c			optional DEBUG_MEMGUARD
 vm/vm_domainset.c		standard
 vm/vm_fault.c			standard
 vm/vm_glue.c			standard
 vm/vm_init.c			standard
 vm/vm_kern.c			standard
 vm/vm_map.c			standard
 vm/vm_meter.c			standard
 vm/vm_mmap.c			standard
 vm/vm_object.c			standard
 vm/vm_page.c			standard
 vm/vm_pageout.c			standard
 vm/vm_pager.c			standard
 vm/vm_phys.c			standard
 vm/vm_radix.c			standard
 vm/vm_reserv.c			standard
 vm/vm_swapout.c			optional !NO_SWAPPING
 vm/vm_swapout_dummy.c		optional NO_SWAPPING
 vm/vm_unix.c			standard
 vm/vnode_pager.c		standard
 xen/features.c			optional xenhvm
 xen/xen_common.c		optional xenhvm
 xen/xenbus/xenbus_if.m		optional xenhvm
 xen/xenbus/xenbus.c		optional xenhvm
 xen/xenbus/xenbusb_if.m		optional xenhvm
 xen/xenbus/xenbusb.c		optional xenhvm
 xen/xenbus/xenbusb_front.c	optional xenhvm
 xen/xenbus/xenbusb_back.c	optional xenhvm
 xen/xenmem/xenmem_if.m		optional xenhvm
 xdr/xdr.c			optional xdr | krpc | nfslockd | nfscl | nfsd
 xdr/xdr_array.c			optional xdr | krpc | nfslockd | nfscl | nfsd
 xdr/xdr_mbuf.c			optional xdr | krpc | nfslockd | nfscl | nfsd
 xdr/xdr_mem.c			optional xdr | krpc | nfslockd | nfscl | nfsd
 xdr/xdr_reference.c		optional xdr | krpc | nfslockd | nfscl | nfsd
 xdr/xdr_sizeof.c		optional xdr | krpc | nfslockd | nfscl | nfsd
diff --git a/sys/dev/sound/clone.c b/sys/dev/sound/clone.c
deleted file mode 100644
index 4cac5f050ee2..000000000000
--- a/sys/dev/sound/clone.c
+++ /dev/null
@@ -1,705 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
- * Copyright (c) 2007 Ariff Abdullah <ariff@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/conf.h>
-#include <sys/kernel.h>
-#include <sys/malloc.h>
-#include <sys/proc.h>
-
-#ifdef HAVE_KERNEL_OPTION_HEADERS
-#include "opt_snd.h"
-#endif
-
-#if defined(SND_DIAGNOSTIC) || defined(SND_DEBUG)
-#include <dev/sound/pcm/sound.h>
-#endif
-
-#include <dev/sound/clone.h>
-
-/*
- * So here we go again, another clonedevs manager. Unlike default clonedevs,
- * this clone manager is designed to withstand various abusive behavior
- * (such as 'while : ; do ls /dev/whatever ; done', etc.), reusable object
- * after reaching certain expiration threshold, aggressive garbage collector,
- * transparent device allocator and concurrency handling across multiple
- * thread/proc. Due to limited information given by dev_clone EVENTHANDLER,
- * we don't have much clues whether the caller wants a real open() or simply
- * making fun of us with things like stat(), mtime() etc. Assuming that:
- * 1) Time window between dev_clone EH <-> real open() should be small
- * enough and 2) mtime()/stat() etc. always looks like a half way / stalled
- * operation, we can decide whether a new cdev must be created, old
- * (expired) cdev can be reused or an existing cdev can be shared.
- *
- * Most of the operations and logics are generic enough and can be applied
- * on other places (such as if_tap, snp, etc).  Perhaps this can be
- * rearranged to complement clone_*(). However, due to this still being
- * specific to the sound driver (and as a proof of concept on how it can be
- * done), si_drv2 is used to keep the pointer of the clone list entry to
- * avoid expensive lookup.
- */
-
-/* clone entry */
-struct snd_clone_entry {
-	TAILQ_ENTRY(snd_clone_entry) link;
-	struct snd_clone *parent;
-	struct cdev *devt;
-	struct timespec tsp;
-	uint32_t flags;
-	pid_t pid;
-	int unit;
-};
-
-/* clone manager */
-struct snd_clone {
-	TAILQ_HEAD(link_head, snd_clone_entry) head;
-	struct timespec tsp;
-	int refcount;
-	int size;
-	int typemask;
-	int maxunit;
-	int deadline;
-	uint32_t flags;
-};
-
-#ifdef SND_DIAGNOSTIC
-#define SND_CLONE_ASSERT(x, y)		do {			\
-	if (!(x))						\
-		panic y;					\
-} while (0)
-#else
-#define SND_CLONE_ASSERT(...)		KASSERT(__VA_ARGS__)
-#endif
-
-/*
- * snd_clone_create() : Return opaque allocated clone manager.
- */
-struct snd_clone *
-snd_clone_create(int typemask, int maxunit, int deadline, uint32_t flags)
-{
-	struct snd_clone *c;
-
-	SND_CLONE_ASSERT(!(typemask & ~SND_CLONE_MAXUNIT),
-	    ("invalid typemask: 0x%08x", typemask));
-	SND_CLONE_ASSERT(maxunit == -1 ||
-	    !(maxunit & ~(~typemask & SND_CLONE_MAXUNIT)),
-	    ("maxunit overflow: typemask=0x%08x maxunit=%d",
-	    typemask, maxunit));
-	SND_CLONE_ASSERT(!(flags & ~SND_CLONE_MASK),
-	    ("invalid clone flags=0x%08x", flags));
-
-	c = malloc(sizeof(*c), M_DEVBUF, M_WAITOK | M_ZERO);
-	c->refcount = 0;
-	c->size = 0;
-	c->typemask = typemask;
-	c->maxunit = (maxunit == -1) ? (~typemask & SND_CLONE_MAXUNIT) :
-	    maxunit;
-	c->deadline = deadline;
-	c->flags = flags;
-	getnanouptime(&c->tsp);
-	TAILQ_INIT(&c->head);
-
-	return (c);
-}
-
-int
-snd_clone_busy(struct snd_clone *c)
-{
-	struct snd_clone_entry *ce;
-
-	SND_CLONE_ASSERT(c != NULL, ("NULL snd_clone"));
-
-	if (c->size == 0)
-		return (0);
-
-	TAILQ_FOREACH(ce, &c->head, link) {
-		if ((ce->flags & SND_CLONE_BUSY) ||
-		    (ce->devt != NULL && ce->devt->si_threadcount != 0))
-			return (EBUSY);
-	}
-
-	return (0);
-}
-
-/*
- * snd_clone_enable()/disable() : Suspend/resume clone allocation through
- * snd_clone_alloc(). Everything else will not be affected by this.
- */
-int
-snd_clone_enable(struct snd_clone *c)
-{
-	SND_CLONE_ASSERT(c != NULL, ("NULL snd_clone"));
-
-	if (c->flags & SND_CLONE_ENABLE)
-		return (EINVAL);
-
-	c->flags |= SND_CLONE_ENABLE;
-
-	return (0);
-}
-
-int
-snd_clone_disable(struct snd_clone *c)
-{
-	SND_CLONE_ASSERT(c != NULL, ("NULL snd_clone"));
-
-	if (!(c->flags & SND_CLONE_ENABLE))
-		return (EINVAL);
-
-	c->flags &= ~SND_CLONE_ENABLE;
-
-	return (0);
-}
-
-/*
- * Getters / Setters. Not worth explaining :)
- */
-int
-snd_clone_getsize(struct snd_clone *c)
-{
-	SND_CLONE_ASSERT(c != NULL, ("NULL snd_clone"));
-
-	return (c->size);
-}
-
-int
-snd_clone_getmaxunit(struct snd_clone *c)
-{
-	SND_CLONE_ASSERT(c != NULL, ("NULL snd_clone"));
-
-	return (c->maxunit);
-}
-
-int
-snd_clone_setmaxunit(struct snd_clone *c, int maxunit)
-{
-	SND_CLONE_ASSERT(c != NULL, ("NULL snd_clone"));
-	SND_CLONE_ASSERT(maxunit == -1 ||
-	    !(maxunit & ~(~c->typemask & SND_CLONE_MAXUNIT)),
-	    ("maxunit overflow: typemask=0x%08x maxunit=%d",
-	    c->typemask, maxunit));
-
-	c->maxunit = (maxunit == -1) ? (~c->typemask & SND_CLONE_MAXUNIT) :
-	    maxunit;
-
-	return (c->maxunit);
-}
-
-int
-snd_clone_getdeadline(struct snd_clone *c)
-{
-	SND_CLONE_ASSERT(c != NULL, ("NULL snd_clone"));
-
-	return (c->deadline);
-}
-
-int
-snd_clone_setdeadline(struct snd_clone *c, int deadline)
-{
-	SND_CLONE_ASSERT(c != NULL, ("NULL snd_clone"));
-
-	c->deadline = deadline;
-
-	return (c->deadline);
-}
-
-uint32_t
-snd_clone_getflags(struct snd_clone *c)
-{
-	SND_CLONE_ASSERT(c != NULL, ("NULL snd_clone"));
-
-	return (c->flags);
-}
-
-uint32_t
-snd_clone_setflags(struct snd_clone *c, uint32_t flags)
-{
-	SND_CLONE_ASSERT(c != NULL, ("NULL snd_clone"));
-	SND_CLONE_ASSERT(!(flags & ~SND_CLONE_MASK),
-	    ("invalid clone flags=0x%08x", flags));
-
-	c->flags = flags;
-
-	return (c->flags);
-}
-
-uint32_t
-snd_clone_getdevflags(struct cdev *dev)
-{
-	struct snd_clone_entry *ce;
-
-	SND_CLONE_ASSERT(dev != NULL, ("NULL dev"));
-
-	ce = dev->si_drv2;
-	if (ce == NULL)
-		return (0xffffffff);
-
-	SND_CLONE_ASSERT(ce->parent != NULL, ("NULL parent"));
-
-	return (ce->flags);
-}
-
-uint32_t
-snd_clone_setdevflags(struct cdev *dev, uint32_t flags)
-{
-	struct snd_clone_entry *ce;
-
-	SND_CLONE_ASSERT(dev != NULL, ("NULL dev"));
-	SND_CLONE_ASSERT(!(flags & ~SND_CLONE_DEVMASK),
-	    ("invalid clone dev flags=0x%08x", flags));
-
-	ce = dev->si_drv2;
-	if (ce == NULL)
-		return (0xffffffff);
-
-	SND_CLONE_ASSERT(ce->parent != NULL, ("NULL parent"));
-
-	ce->flags = flags;
-
-	return (ce->flags);
-}
-
-/* Elapsed time conversion to ms */
-#define SND_CLONE_ELAPSED(x, y)						\
-	((((x)->tv_sec - (y)->tv_sec) * 1000) +				\
-	(((y)->tv_nsec > (x)->tv_nsec) ?				\
-	(((1000000000L + (x)->tv_nsec -					\
-	(y)->tv_nsec) / 1000000) - 1000) :				\
-	(((x)->tv_nsec - (y)->tv_nsec) / 1000000)))
-
-#define SND_CLONE_EXPIRED(x, y, z)					\
-	((x)->deadline < 1 ||						\
-	((y)->tv_sec - (z)->tv_sec) > ((x)->deadline / 1000) ||		\
-	SND_CLONE_ELAPSED(y, z) > (x)->deadline)
-
-/*
- * snd_clone_gc() : Garbage collector for stalled, expired objects. Refer to
- * clone.h for explanations on GC settings.
- */
-int
-snd_clone_gc(struct snd_clone *c)
-{
-	struct snd_clone_entry *ce, *tce;
-	struct timespec now;
-	int pruned;
-
-	SND_CLONE_ASSERT(c != NULL, ("NULL snd_clone"));
-
-	if (!(c->flags & SND_CLONE_GC_ENABLE) || c->size == 0)
-		return (0);
-
-	getnanouptime(&now);
-
-	/*
-	 * Bail out if the last clone handler was invoked below the deadline
-	 * threshold.
-	 */
-	if ((c->flags & SND_CLONE_GC_EXPIRED) &&
-	    !SND_CLONE_EXPIRED(c, &now, &c->tsp))
-		return (0);
-
-	pruned = 0;
-
-	/*
-	 * Visit each object in reverse order. If the object is still being
-	 * referenced by a valid open(), skip it. Look for expired objects
-	 * and either revoke its clone invocation status or mercilessly
-	 * throw it away.
-	 */
-	TAILQ_FOREACH_REVERSE_SAFE(ce, &c->head, link_head, link, tce) {
-		if (!(ce->flags & SND_CLONE_BUSY) &&
-		    (!(ce->flags & SND_CLONE_INVOKE) ||
-		    SND_CLONE_EXPIRED(c, &now, &ce->tsp))) {
-			if ((c->flags & SND_CLONE_GC_REVOKE) ||
-			    ce->devt->si_threadcount != 0) {
-				ce->flags &= ~SND_CLONE_INVOKE;
-				ce->pid = -1;
-			} else {
-				TAILQ_REMOVE(&c->head, ce, link);
-				destroy_dev(ce->devt);
-				free(ce, M_DEVBUF);
-				c->size--;
-			}
-			pruned++;
-		}
-	}
-
-	/* return total pruned objects */
-	return (pruned);
-}
-
-void
-snd_clone_destroy(struct snd_clone *c)
-{
-	struct snd_clone_entry *ce, *tmp;
-
-	SND_CLONE_ASSERT(c != NULL, ("NULL snd_clone"));
-
-	ce = TAILQ_FIRST(&c->head);
-	while (ce != NULL) {
-		tmp = TAILQ_NEXT(ce, link);
-		if (ce->devt != NULL)
-			destroy_dev(ce->devt);
-		free(ce, M_DEVBUF);
-		ce = tmp;
-	}
-
-	free(c, M_DEVBUF);
-}
-
-/*
- * snd_clone_acquire() : The vital part of concurrency management. Must be
- * called somewhere at the beginning of open() handler. ENODEV is not really
- * fatal since it just tell the caller that this is not cloned stuff.
- * EBUSY is *real*, don't forget that!
- */
-int
-snd_clone_acquire(struct cdev *dev)
-{
-	struct snd_clone_entry *ce;
-
-	SND_CLONE_ASSERT(dev != NULL, ("NULL dev"));
-
-	ce = dev->si_drv2;
-	if (ce == NULL)
-		return (ENODEV);
-
-	SND_CLONE_ASSERT(ce->parent != NULL, ("NULL parent"));
-
-	ce->flags &= ~SND_CLONE_INVOKE;
-
-	if (ce->flags & SND_CLONE_BUSY)
-		return (EBUSY);
-
-	ce->flags |= SND_CLONE_BUSY;
-
-	return (0);
-}
-
-/*
- * snd_clone_release() : Release busy status. Must be called somewhere at
- * the end of close() handler, or somewhere after fail open().
- */
-int
-snd_clone_release(struct cdev *dev)
-{
-	struct snd_clone_entry *ce;
-
-	SND_CLONE_ASSERT(dev != NULL, ("NULL dev"));
-
-	ce = dev->si_drv2;
-	if (ce == NULL)
-		return (ENODEV);
-
-	SND_CLONE_ASSERT(ce->parent != NULL, ("NULL parent"));
-
-	ce->flags &= ~SND_CLONE_INVOKE;
-
-	if (!(ce->flags & SND_CLONE_BUSY))
-		return (EBADF);
-
-	ce->flags &= ~SND_CLONE_BUSY;
-	ce->pid = -1;
-
-	return (0);
-}
-
-/*
- * snd_clone_ref/unref() : Garbage collector reference counter. To make
- * garbage collector run automatically, the sequence must be something like
- * this (both in open() and close() handlers):
- *
- *  open() - 1) snd_clone_acquire()
- *           2) .... check check ... if failed, snd_clone_release()
- *           3) Success. Call snd_clone_ref()
- *
- * close() - 1) .... check check check ....
- *           2) Success. snd_clone_release()
- *           3) snd_clone_unref() . Garbage collector will run at this point
- *              if this is the last referenced object.
- */
-int
-snd_clone_ref(struct cdev *dev)
-{
-	struct snd_clone_entry *ce;
-	struct snd_clone *c;
-
-	SND_CLONE_ASSERT(dev != NULL, ("NULL dev"));
-
-	ce = dev->si_drv2;
-	if (ce == NULL)
-		return (0);
-
-	c = ce->parent;
-	SND_CLONE_ASSERT(c != NULL, ("NULL parent"));
-	SND_CLONE_ASSERT(c->refcount >= 0, ("refcount < 0"));
-
-	return (++c->refcount);
-}
-
-int
-snd_clone_unref(struct cdev *dev)
-{
-	struct snd_clone_entry *ce;
-	struct snd_clone *c;
-
-	SND_CLONE_ASSERT(dev != NULL, ("NULL dev"));
-
-	ce = dev->si_drv2;
-	if (ce == NULL)
-		return (0);
-
-	c = ce->parent;
-	SND_CLONE_ASSERT(c != NULL, ("NULL parent"));
-	SND_CLONE_ASSERT(c->refcount > 0, ("refcount <= 0"));
-
-	c->refcount--;
-
-	/* 
-	 * Run automatic garbage collector, if needed.
-	 */
-	if ((c->flags & SND_CLONE_GC_UNREF) &&
-	    (!(c->flags & SND_CLONE_GC_LASTREF) ||
-	    (c->refcount == 0 && (c->flags & SND_CLONE_GC_LASTREF))))
-		(void)snd_clone_gc(c);
-
-	return (c->refcount);
-}
-
-void
-snd_clone_register(struct snd_clone_entry *ce, struct cdev *dev)
-{
-	SND_CLONE_ASSERT(ce != NULL, ("NULL snd_clone_entry"));
-	SND_CLONE_ASSERT(dev != NULL, ("NULL dev"));
-	SND_CLONE_ASSERT(dev->si_drv2 == NULL, ("dev->si_drv2 not NULL"));
-	SND_CLONE_ASSERT((ce->flags & SND_CLONE_ALLOC) == SND_CLONE_ALLOC,
-	    ("invalid clone alloc flags=0x%08x", ce->flags));
-	SND_CLONE_ASSERT(ce->devt == NULL, ("ce->devt not NULL"));
-	SND_CLONE_ASSERT(ce->unit == dev2unit(dev),
-	    ("invalid unit ce->unit=0x%08x dev2unit=0x%08x",
-	    ce->unit, dev2unit(dev)));
-
-	SND_CLONE_ASSERT(ce->parent != NULL, ("NULL parent"));
-
-	dev->si_drv2 = ce;
-	ce->devt = dev;
-	ce->flags &= ~SND_CLONE_ALLOC;
-	ce->flags |= SND_CLONE_INVOKE;
-}
-
-struct snd_clone_entry *
-snd_clone_alloc(struct snd_clone *c, struct cdev **dev, int *unit, int tmask)
-{
-	struct snd_clone_entry *ce, *after, *bce, *cce, *nce, *tce;
-	struct timespec now;
-	int cunit, allocunit;
-	pid_t curpid;
-
-	SND_CLONE_ASSERT(c != NULL, ("NULL snd_clone"));
-	SND_CLONE_ASSERT(dev != NULL, ("NULL dev pointer"));
-	SND_CLONE_ASSERT((c->typemask & tmask) == tmask,
-	    ("invalid tmask: typemask=0x%08x tmask=0x%08x",
-	    c->typemask, tmask));
-	SND_CLONE_ASSERT(unit != NULL, ("NULL unit pointer"));
-	SND_CLONE_ASSERT(*unit == -1 || !(*unit & (c->typemask | tmask)),
-	    ("typemask collision: typemask=0x%08x tmask=0x%08x *unit=%d",
-	    c->typemask, tmask, *unit));
-
-	if (!(c->flags & SND_CLONE_ENABLE) ||
-	    (*unit != -1 && *unit > c->maxunit))
-		return (NULL);
-
-	ce = NULL;
-	after = NULL;
-	bce = NULL;	/* "b"usy candidate */
-	cce = NULL;	/* "c"urthread/proc candidate */
-	nce = NULL;	/* "n"ull, totally unbusy candidate */
-	tce = NULL;	/* Last "t"ry candidate */
-	cunit = 0;
-	allocunit = (*unit == -1) ? 0 : *unit;
-	curpid = curthread->td_proc->p_pid;
-
-	getnanouptime(&now);
-
-	TAILQ_FOREACH(ce, &c->head, link) {
-		/*
-		 * Sort incrementally according to device type.
-		 */
-		if (tmask > (ce->unit & c->typemask)) {
-			if (cunit == 0)
-				after = ce;
-			continue;
-		} else if (tmask < (ce->unit & c->typemask))
-			break;
-
-		/*
-		 * Shoot.. this is where the grumpiness begin. Just
-		 * return immediately.
-		 */
-		if (*unit != -1 && *unit == (ce->unit & ~tmask))
-			goto snd_clone_alloc_out;
-
-		cunit++;
-		/*
-		 * Simmilar device type. Sort incrementally according
-		 * to allocation unit. While here, look for free slot
-		 * and possible collision for new / future allocation.
-		 */
-		if (*unit == -1 && (ce->unit & ~tmask) == allocunit)
-			allocunit++;
-		if ((ce->unit & ~tmask) < allocunit)
-			after = ce;
-		/*
-		 * Clone logic:
-		 *   1. Look for non busy, but keep track of the best
-		 *      possible busy cdev.
-		 *   2. Look for the best (oldest referenced) entry that is
-		 *      in a same process / thread.
-		 *   3. Look for the best (oldest referenced), absolute free
-		 *      entry.
-		 *   4. Lastly, look for the best (oldest referenced)
-		 *      any entries that doesn't fit with anything above.
-		 */
-		if (ce->flags & SND_CLONE_BUSY) {
-			if (ce->devt != NULL && (bce == NULL ||
-			    timespeccmp(&ce->tsp, &bce->tsp, <)))
-				bce = ce;
-			continue;
-		}
-		if (ce->pid == curpid &&
-		    (cce == NULL || timespeccmp(&ce->tsp, &cce->tsp, <)))
-			cce = ce;
-		else if (!(ce->flags & SND_CLONE_INVOKE) &&
-		    (nce == NULL || timespeccmp(&ce->tsp, &nce->tsp, <)))
-			nce = ce;
-		else if (tce == NULL || timespeccmp(&ce->tsp, &tce->tsp, <))
-			tce = ce;
-	}
-	if (*unit != -1)
-		goto snd_clone_alloc_new;
-	else if (cce != NULL) {
-		/* Same proc entry found, go for it */
-		ce = cce;
-		goto snd_clone_alloc_out;
-	} else if (nce != NULL) {
-		/*
-		 * Next, try absolute free entry. If the calculated
-		 * allocunit is smaller, create new entry instead.
-		 */
-		if (allocunit < (nce->unit & ~tmask))
-			goto snd_clone_alloc_new;
-		ce = nce;
-		goto snd_clone_alloc_out;
-	} else if (allocunit > c->maxunit) {
-		/*
-		 * Maximum allowable unit reached. Try returning any
-		 * available cdev and hope for the best. If the lookup is
-		 * done for things like stat(), mtime() etc. , things should
-		 * be ok. Otherwise, open() handler should do further checks
-		 * and decide whether to return correct error code or not.
-		 */
-		if (tce != NULL) {
-			ce = tce;
-			goto snd_clone_alloc_out;
-		} else if (bce != NULL) {
-			ce = bce;
-			goto snd_clone_alloc_out;
-		}
-		return (NULL);
-	}
-
-snd_clone_alloc_new:
-	/*
-	 * No free entries found, and we still haven't reached maximum
-	 * allowable units. Allocate, setup a minimal unique entry with busy
-	 * status so nobody will monkey on this new entry. Unit magic is set
-	 * right here to avoid collision with other contesting handler.
-	 * The caller must be carefull here to maintain its own
-	 * synchronization, as long as it will not conflict with malloc(9)
-	 * operations.
-	 *
-	 * That said, go figure.
-	 */
-	ce = malloc(sizeof(*ce), M_DEVBUF,
-	    ((c->flags & SND_CLONE_WAITOK) ? M_WAITOK : M_NOWAIT) | M_ZERO);
-	if (ce == NULL) {
-		if (*unit != -1)
-			return (NULL);
-		/*
-		 * We're being dense, ignorance is bliss,
-		 * Super Regulatory Measure (TM).. TRY AGAIN!
-		 */
-		if (nce != NULL) {
-			ce = nce;
-			goto snd_clone_alloc_out;
-		} else if (tce != NULL) {
-			ce = tce;
-			goto snd_clone_alloc_out;
-		} else if (bce != NULL) {
-			ce = bce;
-			goto snd_clone_alloc_out;
-		}
-		return (NULL);
-	}
-	/* Setup new entry */
-	ce->parent = c;
-	ce->unit = tmask | allocunit;
-	ce->pid = curpid;
-	ce->tsp = now;
-	ce->flags |= SND_CLONE_ALLOC;
-	if (after != NULL) {
-		TAILQ_INSERT_AFTER(&c->head, after, ce, link);
-	} else {
-		TAILQ_INSERT_HEAD(&c->head, ce, link);
-	}
-	c->size++;
-	c->tsp = now;
-	/*
-	 * Save new allocation unit for caller which will be used
-	 * by make_dev().
-	 */
-	*unit = allocunit;
-
-	return (ce);
-
-snd_clone_alloc_out:
-	/*
-	 * Set, mark, timestamp the entry if this is a truly free entry.
-	 * Leave busy entry alone.
-	 */
-	if (!(ce->flags & SND_CLONE_BUSY)) {
-		ce->pid = curpid;
-		ce->tsp = now;
-		ce->flags |= SND_CLONE_INVOKE;
-	}
-	c->tsp = now;
-	*dev = ce->devt;
-
-	return (NULL);
-}
diff --git a/sys/dev/sound/clone.h b/sys/dev/sound/clone.h
deleted file mode 100644
index 38b57b85b3e4..000000000000
--- a/sys/dev/sound/clone.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
- * Copyright (c) 2007 Ariff Abdullah <ariff@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _SND_CLONE_H_
-#define _SND_CLONE_H_
-
-struct snd_clone_entry;
-struct snd_clone;
-
-/*
- * 750 milisecond default deadline. Short enough to not cause excessive
- * garbage collection, long enough to indicate stalled VFS.
- */
-#define SND_CLONE_DEADLINE_DEFAULT	750
-
-/*
- * Fit within 24bit MAXMINOR.
- */
-#define SND_CLONE_MAXUNIT		0xffffff
-
-/*
- * Creation flags, mostly related to the behaviour of garbage collector.
- *
- * SND_CLONE_ENABLE     - Enable clone allocation.
- * SND_CLONE_GC_ENABLE  - Enable garbage collector operation, automatically
- *                        or if explicitly called upon.
- * SND_CLONE_GC_UNREF   - Garbage collect during unref operation.
- * SND_CLONE_GC_LASTREF - Garbage collect during last reference
- *                        (refcount = 0)
- * SND_CLONE_GC_EXPIRED - Don't garbage collect unless the global clone
- *                        handler has been expired.
- * SND_CLONE_GC_REVOKE  - Revoke clone invocation status which has been
- *                        expired instead of removing and freeing it.
- * SND_CLONE_WAITOK     - malloc() is allowed to sleep while allocating
- *                        clone entry.
- */
-#define SND_CLONE_ENABLE	0x00000001
-#define SND_CLONE_GC_ENABLE	0x00000002
-#define SND_CLONE_GC_UNREF	0x00000004
-#define SND_CLONE_GC_LASTREF	0x00000008
-#define SND_CLONE_GC_EXPIRED	0x00000010
-#define SND_CLONE_GC_REVOKE	0x00000020
-#define SND_CLONE_WAITOK	0x80000000
-
-#define SND_CLONE_GC_MASK	(SND_CLONE_GC_ENABLE  |			\
-				 SND_CLONE_GC_UNREF   |			\
-				 SND_CLONE_GC_LASTREF |			\
-				 SND_CLONE_GC_EXPIRED |			\
-				 SND_CLONE_GC_REVOKE)
-
-#define SND_CLONE_MASK		(SND_CLONE_ENABLE | SND_CLONE_GC_MASK |	\
-				 SND_CLONE_WAITOK)
-
-/*
- * Runtime clone device flags
- *
- * These are mostly private to the clone manager operation:
- *
- * SND_CLONE_NEW    - New clone allocation in progress.
- * SND_CLONE_INVOKE - Cloning being invoked, waiting for next VFS operation.
- * SND_CLONE_BUSY   - In progress, being referenced by living thread/proc.
- */
-#define SND_CLONE_NEW		0x00000001
-#define SND_CLONE_INVOKE	0x00000002
-#define SND_CLONE_BUSY		0x00000004
-
-/*
- * Nothing important, just for convenience.
- */
-#define SND_CLONE_ALLOC		(SND_CLONE_NEW | SND_CLONE_INVOKE |	\
-				 SND_CLONE_BUSY)
-
-#define SND_CLONE_DEVMASK	SND_CLONE_ALLOC
-
-struct snd_clone *snd_clone_create(int, int, int, uint32_t);
-int snd_clone_busy(struct snd_clone *);
-int snd_clone_enable(struct snd_clone *);
-int snd_clone_disable(struct snd_clone *);
-int snd_clone_getsize(struct snd_clone *);
-int snd_clone_getmaxunit(struct snd_clone *);
-int snd_clone_setmaxunit(struct snd_clone *, int);
-int snd_clone_getdeadline(struct snd_clone *);
-int snd_clone_setdeadline(struct snd_clone *, int);
-uint32_t snd_clone_getflags(struct snd_clone *);
-uint32_t snd_clone_setflags(struct snd_clone *, uint32_t);
-uint32_t snd_clone_getdevflags(struct cdev *);
-uint32_t snd_clone_setdevflags(struct cdev *, uint32_t);
-int snd_clone_gc(struct snd_clone *);
-void snd_clone_destroy(struct snd_clone *);
-int snd_clone_acquire(struct cdev *);
-int snd_clone_release(struct cdev *);
-int snd_clone_ref(struct cdev *);
-int snd_clone_unref(struct cdev *);
-void snd_clone_register(struct snd_clone_entry *, struct cdev *);
-struct snd_clone_entry *snd_clone_alloc(struct snd_clone *, struct cdev **,
-    int *, int);
-
-#define snd_clone_enabled(x)	((x) != NULL && 			\
-				(snd_clone_getflags(x) & SND_CLONE_ENABLE))
-#define snd_clone_disabled(x)	(!snd_clone_enabled(x))
-
-#endif /* !_SND_CLONE_H */
diff --git a/sys/dev/sound/pcm/dsp.c b/sys/dev/sound/pcm/dsp.c
index 9040c77893d4..b9693908da43 100644
--- a/sys/dev/sound/pcm/dsp.c
+++ b/sys/dev/sound/pcm/dsp.c
@@ -1,3412 +1,3007 @@
 /*-
  * SPDX-License-Identifier: BSD-2-Clause
  *
  * Copyright (c) 2005-2009 Ariff Abdullah <ariff@FreeBSD.org>
  * Portions Copyright (c) Ryan Beasley <ryan.beasley@gmail.com> - GSoC 2006
  * Copyright (c) 1999 Cameron Grant <cg@FreeBSD.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
 
 #ifdef HAVE_KERNEL_OPTION_HEADERS
 #include "opt_snd.h"
 #endif
 
 #include <dev/sound/pcm/sound.h>
 #include <sys/ctype.h>
 #include <sys/lock.h>
 #include <sys/rwlock.h>
 #include <sys/sysent.h>
 
 #include <vm/vm.h>
 #include <vm/vm_object.h>
 #include <vm/vm_page.h>
 #include <vm/vm_pager.h>
 
+struct dsp_cdevpriv {
+	struct snddev_info *sc;
+	struct pcm_channel *rdch;
+	struct pcm_channel *wrch;
+	struct pcm_channel *volch;
+	int simplex;
+};
+
 static int dsp_mmap_allow_prot_exec = 0;
 SYSCTL_INT(_hw_snd, OID_AUTO, compat_linux_mmap, CTLFLAG_RWTUN,
     &dsp_mmap_allow_prot_exec, 0,
     "linux mmap compatibility (-1=force disable 0=auto 1=force enable)");
 
 static int dsp_basename_clone = 1;
 SYSCTL_INT(_hw_snd, OID_AUTO, basename_clone, CTLFLAG_RWTUN,
     &dsp_basename_clone, 0,
     "DSP basename cloning (0: Disable; 1: Enabled)");
 
-struct dsp_cdevinfo {
-	struct pcm_channel *rdch, *wrch;
-	struct pcm_channel *volch;
-	int busy, simplex;
-	TAILQ_ENTRY(dsp_cdevinfo) link;
-};
-
-#define PCM_RDCH(x)		(((struct dsp_cdevinfo *)(x)->si_drv1)->rdch)
-#define PCM_WRCH(x)		(((struct dsp_cdevinfo *)(x)->si_drv1)->wrch)
-#define PCM_VOLCH(x)		(((struct dsp_cdevinfo *)(x)->si_drv1)->volch)
-#define PCM_SIMPLEX(x)		(((struct dsp_cdevinfo *)(x)->si_drv1)->simplex)
-
-#define DSP_CDEVINFO_CACHESIZE	8
-
-#define DSP_REGISTERED(x, y)	(PCM_REGISTERED(x) &&			\
-				 (y) != NULL && (y)->si_drv1 != NULL)
+#define DSP_REGISTERED(x)	(PCM_REGISTERED(x) && (x)->dsp_dev != NULL)
 
 #define OLDPCM_IOCTL
 
 static d_open_t dsp_open;
-static d_close_t dsp_close;
 static d_read_t dsp_read;
 static d_write_t dsp_write;
 static d_ioctl_t dsp_ioctl;
 static d_poll_t dsp_poll;
 static d_mmap_t dsp_mmap;
 static d_mmap_single_t dsp_mmap_single;
 
 struct cdevsw dsp_cdevsw = {
 	.d_version =	D_VERSION,
 	.d_open =	dsp_open,
-	.d_close =	dsp_close,
 	.d_read =	dsp_read,
 	.d_write =	dsp_write,
 	.d_ioctl =	dsp_ioctl,
 	.d_poll =	dsp_poll,
 	.d_mmap =	dsp_mmap,
 	.d_mmap_single = dsp_mmap_single,
 	.d_name =	"dsp",
 };
 
 static eventhandler_tag dsp_ehtag = NULL;
-static int dsp_umax = -1;
-static int dsp_cmax = -1;
 
 static int dsp_oss_syncgroup(struct pcm_channel *wrch, struct pcm_channel *rdch, oss_syncgroup *group);
 static int dsp_oss_syncstart(int sg_id);
 static int dsp_oss_policy(struct pcm_channel *wrch, struct pcm_channel *rdch, int policy);
 static int dsp_oss_cookedmode(struct pcm_channel *wrch, struct pcm_channel *rdch, int enabled);
 static int dsp_oss_getchnorder(struct pcm_channel *wrch, struct pcm_channel *rdch, unsigned long long *map);
 static int dsp_oss_setchnorder(struct pcm_channel *wrch, struct pcm_channel *rdch, unsigned long long *map);
 static int dsp_oss_getchannelmask(struct pcm_channel *wrch, struct pcm_channel *rdch, int *mask);
 #ifdef OSSV4_EXPERIMENT
 static int dsp_oss_getlabel(struct pcm_channel *wrch, struct pcm_channel *rdch, oss_label_t *label);
 static int dsp_oss_setlabel(struct pcm_channel *wrch, struct pcm_channel *rdch, oss_label_t *label);
 static int dsp_oss_getsong(struct pcm_channel *wrch, struct pcm_channel *rdch, oss_longname_t *song);
 static int dsp_oss_setsong(struct pcm_channel *wrch, struct pcm_channel *rdch, oss_longname_t *song);
 static int dsp_oss_setname(struct pcm_channel *wrch, struct pcm_channel *rdch, oss_longname_t *name);
 #endif
 
-static struct snddev_info *
-dsp_get_info(struct cdev *dev)
-{
-	return (devclass_get_softc(pcm_devclass, PCMUNIT(dev)));
-}
-
 static uint32_t
 dsp_get_flags(struct cdev *dev)
 {
 	device_t bdev;
 
 	bdev = devclass_get_device(pcm_devclass, PCMUNIT(dev));
 
 	return ((bdev != NULL) ? pcm_getflags(bdev) : 0xffffffff);
 }
 
 static void
 dsp_set_flags(struct cdev *dev, uint32_t flags)
 {
 	device_t bdev;
 
 	bdev = devclass_get_device(pcm_devclass, PCMUNIT(dev));
 
 	if (bdev != NULL)
 		pcm_setflags(bdev, flags);
 }
 
-/*
- * return the channels associated with an open device instance.
- * lock channels specified.
- */
-static int
-getchns(struct cdev *dev, struct pcm_channel **rdch, struct pcm_channel **wrch,
-    uint32_t prio)
+int
+dsp_make_dev(device_t dev)
+{
+	struct make_dev_args devargs;
+	struct snddev_info *sc;
+	int err, unit;
+
+	sc = device_get_softc(dev);
+	unit = device_get_unit(dev);
+
+	make_dev_args_init(&devargs);
+	devargs.mda_devsw = &dsp_cdevsw;
+	devargs.mda_uid = UID_ROOT;
+	devargs.mda_gid = GID_WHEEL;
+	devargs.mda_mode = 0666;
+	devargs.mda_si_drv1 = sc;
+	err = make_dev_s(&devargs, &sc->dsp_dev, "dsp%d", unit);
+	if (err != 0) {
+		device_printf(dev, "failed to create dsp%d: error %d",
+		    unit, err);
+		return (ENXIO);
+	}
+
+	return (0);
+}
+
+void
+dsp_destroy_dev(device_t dev)
+{
+	struct snddev_info *d;
+
+	d = device_get_softc(dev);
+	destroy_dev_sched(d->dsp_dev);
+}
+
+static void
+getchns(struct dsp_cdevpriv *priv, uint32_t prio)
 {
 	struct snddev_info *d;
 	struct pcm_channel *ch;
 	uint32_t flags;
 
-	if (PCM_SIMPLEX(dev) != 0) {
-		d = dsp_get_info(dev);
+	if (priv->simplex) {
+		d = priv->sc;
 		if (!PCM_REGISTERED(d))
-			return (ENXIO);
+			return;
 		PCM_LOCK(d);
 		PCM_WAIT(d);
 		PCM_ACQUIRE(d);
 		/*
 		 * Note: order is important -
 		 *       pcm flags -> prio query flags -> wild guess
 		 */
 		ch = NULL;
-		flags = dsp_get_flags(dev);
+		flags = dsp_get_flags(d->dsp_dev);
 		if (flags & SD_F_PRIO_WR) {
-			ch = PCM_RDCH(dev);
-			PCM_RDCH(dev) = NULL;
+			ch = priv->rdch;
 		} else if (flags & SD_F_PRIO_RD) {
-			ch = PCM_WRCH(dev);
-			PCM_WRCH(dev) = NULL;
+			ch = priv->wrch;
 		} else if (prio & SD_F_PRIO_WR) {
-			ch = PCM_RDCH(dev);
-			PCM_RDCH(dev) = NULL;
+			ch = priv->rdch;
 			flags |= SD_F_PRIO_WR;
 		} else if (prio & SD_F_PRIO_RD) {
-			ch = PCM_WRCH(dev);
-			PCM_WRCH(dev) = NULL;
+			ch = priv->wrch;
 			flags |= SD_F_PRIO_RD;
-		} else if (PCM_WRCH(dev) != NULL) {
-			ch = PCM_RDCH(dev);
-			PCM_RDCH(dev) = NULL;
+		} else if (priv->wrch != NULL) {
+			ch = priv->rdch;
 			flags |= SD_F_PRIO_WR;
-		} else if (PCM_RDCH(dev) != NULL) {
-			ch = PCM_WRCH(dev);
-			PCM_WRCH(dev) = NULL;
+		} else if (priv->rdch != NULL) {
+			ch = priv->wrch;
 			flags |= SD_F_PRIO_RD;
 		}
-		PCM_SIMPLEX(dev) = 0;
-		dsp_set_flags(dev, flags);
+		dsp_set_flags(d->dsp_dev, flags);
 		if (ch != NULL) {
 			CHN_LOCK(ch);
 			pcm_chnref(ch, -1);
 			pcm_chnrelease(ch);
 		}
 		PCM_RELEASE(d);
 		PCM_UNLOCK(d);
 	}
 
-	*rdch = PCM_RDCH(dev);
-	*wrch = PCM_WRCH(dev);
-
-	if (*rdch != NULL && (prio & SD_F_PRIO_RD))
-		CHN_LOCK(*rdch);
-	if (*wrch != NULL && (prio & SD_F_PRIO_WR))
-		CHN_LOCK(*wrch);
-
-	return (0);
-}
-
-/* unlock specified channels */
-static void
-relchns(struct cdev *dev, struct pcm_channel *rdch, struct pcm_channel *wrch,
-    uint32_t prio)
-{
-	if (wrch != NULL && (prio & SD_F_PRIO_WR))
-		CHN_UNLOCK(wrch);
-	if (rdch != NULL && (prio & SD_F_PRIO_RD))
-		CHN_UNLOCK(rdch);
-}
-
-static void
-dsp_cdevinfo_alloc(struct cdev *dev,
-    struct pcm_channel *rdch, struct pcm_channel *wrch,
-    struct pcm_channel *volch)
-{
-	struct snddev_info *d;
-	struct dsp_cdevinfo *cdi;
-	int simplex;
-
-	d = dsp_get_info(dev);
-
-	KASSERT(PCM_REGISTERED(d) && dev != NULL && dev->si_drv1 == NULL &&
-	    ((rdch == NULL && wrch == NULL) || rdch != wrch),
-	    ("bogus %s(), what are you trying to accomplish here?", __func__));
-	PCM_BUSYASSERT(d);
-	PCM_LOCKASSERT(d);
-
-	simplex = (dsp_get_flags(dev) & SD_F_SIMPLEX) ? 1 : 0;
-
-	/*
-	 * Scan for free instance entry and put it into the end of list.
-	 * Create new one if necessary.
-	 */
-	TAILQ_FOREACH(cdi, &d->dsp_cdevinfo_pool, link) {
-		if (cdi->busy != 0)
-			break;
-		cdi->rdch = rdch;
-		cdi->wrch = wrch;
-		cdi->volch = volch;
-		cdi->simplex = simplex;
-		cdi->busy = 1;
-		TAILQ_REMOVE(&d->dsp_cdevinfo_pool, cdi, link);
-		TAILQ_INSERT_TAIL(&d->dsp_cdevinfo_pool, cdi, link);
-		dev->si_drv1 = cdi;
-		return;
-	}
-	PCM_UNLOCK(d);
-	cdi = malloc(sizeof(*cdi), M_DEVBUF, M_WAITOK | M_ZERO);
-	PCM_LOCK(d);
-	cdi->rdch = rdch;
-	cdi->wrch = wrch;
-	cdi->volch = volch;
-	cdi->simplex = simplex;
-	cdi->busy = 1;
-	TAILQ_INSERT_TAIL(&d->dsp_cdevinfo_pool, cdi, link);
-	dev->si_drv1 = cdi;
+	if (priv->rdch != NULL && (prio & SD_F_PRIO_RD))
+		CHN_LOCK(priv->rdch);
+	if (priv->wrch != NULL && (prio & SD_F_PRIO_WR))
+		CHN_LOCK(priv->wrch);
 }
 
 static void
-dsp_cdevinfo_free(struct cdev *dev)
+relchns(struct dsp_cdevpriv *priv, uint32_t prio)
 {
-	struct snddev_info *d;
-	struct dsp_cdevinfo *cdi, *tmp;
-	uint32_t flags;
-	int i;
-
-	d = dsp_get_info(dev);
-
-	KASSERT(PCM_REGISTERED(d) && dev != NULL && dev->si_drv1 != NULL &&
-	    PCM_RDCH(dev) == NULL && PCM_WRCH(dev) == NULL &&
-	    PCM_VOLCH(dev) == NULL,
-	    ("bogus %s(), what are you trying to accomplish here?", __func__));
-	PCM_BUSYASSERT(d);
-	PCM_LOCKASSERT(d);
-
-	cdi = dev->si_drv1;
-	dev->si_drv1 = NULL;
-	cdi->rdch = NULL;
-	cdi->wrch = NULL;
-	cdi->volch = NULL;
-	cdi->simplex = 0;
-	cdi->busy = 0;
-
-	/*
-	 * Once it is free, move it back to the beginning of list for
-	 * faster new entry allocation.
-	 */
-	TAILQ_REMOVE(&d->dsp_cdevinfo_pool, cdi, link);
-	TAILQ_INSERT_HEAD(&d->dsp_cdevinfo_pool, cdi, link);
-
-	/*
-	 * Scan the list, cache free entries up to DSP_CDEVINFO_CACHESIZE.
-	 * Reset simplex flags.
-	 */
-	flags = dsp_get_flags(dev) & ~SD_F_PRIO_SET;
-	i = DSP_CDEVINFO_CACHESIZE;
-	TAILQ_FOREACH_SAFE(cdi, &d->dsp_cdevinfo_pool, link, tmp) {
-		if (cdi->busy != 0) {
-			if (cdi->simplex == 0) {
-				if (cdi->rdch != NULL)
-					flags |= SD_F_PRIO_RD;
-				if (cdi->wrch != NULL)
-					flags |= SD_F_PRIO_WR;
-			}
-		} else {
-			if (i == 0) {
-				TAILQ_REMOVE(&d->dsp_cdevinfo_pool, cdi, link);
-				free(cdi, M_DEVBUF);
-			} else
-				i--;
-		}
-	}
-	dsp_set_flags(dev, flags);
-}
-
-void
-dsp_cdevinfo_init(struct snddev_info *d)
-{
-	struct dsp_cdevinfo *cdi;
-	int i;
-
-	KASSERT(d != NULL, ("NULL snddev_info"));
-	PCM_BUSYASSERT(d);
-	PCM_UNLOCKASSERT(d);
-
-	TAILQ_INIT(&d->dsp_cdevinfo_pool);
-	for (i = 0; i < DSP_CDEVINFO_CACHESIZE; i++) {
-		cdi = malloc(sizeof(*cdi), M_DEVBUF, M_WAITOK | M_ZERO);
-		TAILQ_INSERT_HEAD(&d->dsp_cdevinfo_pool, cdi, link);
-	}
-}
-
-void
-dsp_cdevinfo_flush(struct snddev_info *d)
-{
-	struct dsp_cdevinfo *cdi, *tmp;
-
-	KASSERT(d != NULL, ("NULL snddev_info"));
-	PCM_BUSYASSERT(d);
-	PCM_UNLOCKASSERT(d);
-
-	cdi = TAILQ_FIRST(&d->dsp_cdevinfo_pool);
-	while (cdi != NULL) {
-		tmp = TAILQ_NEXT(cdi, link);
-		free(cdi, M_DEVBUF);
-		cdi = tmp;
-	}
-	TAILQ_INIT(&d->dsp_cdevinfo_pool);
+	if (priv->rdch != NULL && (prio & SD_F_PRIO_RD))
+		CHN_UNLOCK(priv->rdch);
+	if (priv->wrch != NULL && (prio & SD_F_PRIO_WR))
+		CHN_UNLOCK(priv->wrch);
 }
 
 /* duplex / simplex cdev type */
 enum {
 	DSP_CDEV_TYPE_RDONLY,		/* simplex read-only (record)   */
 	DSP_CDEV_TYPE_WRONLY,		/* simplex write-only (play)    */
 	DSP_CDEV_TYPE_RDWR		/* duplex read, write, or both  */
 };
 
-enum {
-	DSP_CDEV_VOLCTL_NONE,
-	DSP_CDEV_VOLCTL_READ,
-	DSP_CDEV_VOLCTL_WRITE
-};
-
 #define DSP_F_VALID(x)		((x) & (FREAD | FWRITE))
 #define DSP_F_DUPLEX(x)		(((x) & (FREAD | FWRITE)) == (FREAD | FWRITE))
 #define DSP_F_SIMPLEX(x)	(!DSP_F_DUPLEX(x))
 #define DSP_F_READ(x)		((x) & FREAD)
 #define DSP_F_WRITE(x)		((x) & FWRITE)
 
 static const struct {
 	int type;
 	char *name;
 	char *sep;
 	char *alias;
 	int use_sep;
 	int hw;
 	int max;
 	int volctl;
 	uint32_t fmt, spd;
 	int query;
 } dsp_cdevs[] = {
 	{ SND_DEV_DSP,         "dsp",    ".", NULL, 0, 0, 0, 0,
 	  SND_FORMAT(AFMT_U8, 1, 0),     DSP_DEFAULT_SPEED,
 	  DSP_CDEV_TYPE_RDWR },
 	{ SND_DEV_AUDIO,       "audio",  ".", NULL, 0, 0, 0, 0,
 	  SND_FORMAT(AFMT_MU_LAW, 1, 0), DSP_DEFAULT_SPEED,
 	  DSP_CDEV_TYPE_RDWR },
 	{ SND_DEV_DSP16,       "dspW",   ".", NULL, 0, 0, 0, 0,
 	  SND_FORMAT(AFMT_S16_LE, 1, 0), DSP_DEFAULT_SPEED,
 	  DSP_CDEV_TYPE_RDWR },
 	{ SND_DEV_DSPHW_PLAY,  "dsp",   ".p", NULL, 1, 1, SND_MAXHWCHAN, 1,
 	  SND_FORMAT(AFMT_S16_LE, 2, 0), 48000, DSP_CDEV_TYPE_WRONLY },
 	{ SND_DEV_DSPHW_VPLAY, "dsp",  ".vp", NULL, 1, 1, SND_MAXVCHANS, 1,
 	  SND_FORMAT(AFMT_S16_LE, 2, 0), 48000, DSP_CDEV_TYPE_WRONLY },
 	{ SND_DEV_DSPHW_REC,   "dsp",   ".r", NULL, 1, 1, SND_MAXHWCHAN, 1,
 	  SND_FORMAT(AFMT_S16_LE, 2, 0), 48000, DSP_CDEV_TYPE_RDONLY },
 	{ SND_DEV_DSPHW_VREC,  "dsp",  ".vr", NULL, 1, 1, SND_MAXVCHANS, 1,
 	  SND_FORMAT(AFMT_S16_LE, 2, 0), 48000, DSP_CDEV_TYPE_RDONLY },
 	{ SND_DEV_DSPHW_CD,    "dspcd",  ".", NULL, 0, 0, 0, 0,
 	  SND_FORMAT(AFMT_S16_LE, 2, 0), 44100, DSP_CDEV_TYPE_RDWR   },
 	/* Low priority, OSSv4 aliases. */
 	{ SND_DEV_DSP,      "dsp_ac3",   ".", "dsp", 0, 0, 0, 0,
 	  SND_FORMAT(AFMT_U8, 1, 0),     DSP_DEFAULT_SPEED,
 	  DSP_CDEV_TYPE_RDWR },
 	{ SND_DEV_DSP,     "dsp_mmap",   ".", "dsp", 0, 0, 0, 0,
 	  SND_FORMAT(AFMT_U8, 1, 0),     DSP_DEFAULT_SPEED,
 	  DSP_CDEV_TYPE_RDWR },
 	{ SND_DEV_DSP,  "dsp_multich",   ".", "dsp", 0, 0, 0, 0,
 	  SND_FORMAT(AFMT_U8, 1, 0),     DSP_DEFAULT_SPEED,
 	  DSP_CDEV_TYPE_RDWR },
 	{ SND_DEV_DSP, "dsp_spdifout",   ".", "dsp", 0, 0, 0, 0,
 	  SND_FORMAT(AFMT_U8, 1, 0),     DSP_DEFAULT_SPEED,
 	  DSP_CDEV_TYPE_RDWR },
 	{ SND_DEV_DSP,  "dsp_spdifin",   ".", "dsp", 0, 0, 0, 0,
 	  SND_FORMAT(AFMT_U8, 1, 0),     DSP_DEFAULT_SPEED,
 	  DSP_CDEV_TYPE_RDWR },
 };
 
+static void
+dsp_close(void *data)
+{
+	struct dsp_cdevpriv *priv = data;
+	struct pcm_channel *rdch, *wrch, *volch;
+	struct snddev_info *d;
+	int sg_ids, rdref, wdref;
+
+	if (priv == NULL)
+		return;
+
+	d = priv->sc;
+	/* At this point pcm_unregister() will destroy all channels anyway. */
+	if (!PCM_REGISTERED(d))
+		goto skip;
+
+	PCM_GIANT_ENTER(d);
+
+	PCM_LOCK(d);
+	PCM_WAIT(d);
+	PCM_ACQUIRE(d);
+
+	rdch = priv->rdch;
+	wrch = priv->wrch;
+	volch = priv->volch;
+
+	rdref = -1;
+	wdref = -1;
+
+	if (volch != NULL) {
+		if (volch == rdch)
+			rdref--;
+		else if (volch == wrch)
+			wdref--;
+		else {
+			CHN_LOCK(volch);
+			pcm_chnref(volch, -1);
+			CHN_UNLOCK(volch);
+		}
+	}
+
+	if (rdch != NULL)
+		CHN_REMOVE(d, rdch, channels.pcm.opened);
+	if (wrch != NULL)
+		CHN_REMOVE(d, wrch, channels.pcm.opened);
+
+	if (rdch != NULL || wrch != NULL) {
+		PCM_UNLOCK(d);
+		if (rdch != NULL) {
+			/*
+			 * The channel itself need not be locked because:
+			 *   a)  Adding a channel to a syncgroup happens only
+			 *       in dsp_ioctl(), which cannot run concurrently
+			 *       to dsp_close().
+			 *   b)  The syncmember pointer (sm) is protected by
+			 *       the global syncgroup list lock.
+			 *   c)  A channel can't just disappear, invalidating
+			 *       pointers, unless it's closed/dereferenced
+			 *       first.
+			 */
+			PCM_SG_LOCK();
+			sg_ids = chn_syncdestroy(rdch);
+			PCM_SG_UNLOCK();
+			if (sg_ids != 0)
+				free_unr(pcmsg_unrhdr, sg_ids);
+
+			CHN_LOCK(rdch);
+			pcm_chnref(rdch, rdref);
+			chn_abort(rdch); /* won't sleep */
+			rdch->flags &= ~(CHN_F_RUNNING | CHN_F_MMAP |
+			    CHN_F_DEAD | CHN_F_EXCLUSIVE);
+			chn_reset(rdch, 0, 0);
+			pcm_chnrelease(rdch);
+		}
+		if (wrch != NULL) {
+			/*
+			 * Please see block above.
+			 */
+			PCM_SG_LOCK();
+			sg_ids = chn_syncdestroy(wrch);
+			PCM_SG_UNLOCK();
+			if (sg_ids != 0)
+				free_unr(pcmsg_unrhdr, sg_ids);
+
+			CHN_LOCK(wrch);
+			pcm_chnref(wrch, wdref);
+			chn_flush(wrch); /* may sleep */
+			wrch->flags &= ~(CHN_F_RUNNING | CHN_F_MMAP |
+			    CHN_F_DEAD | CHN_F_EXCLUSIVE);
+			chn_reset(wrch, 0, 0);
+			pcm_chnrelease(wrch);
+		}
+		PCM_LOCK(d);
+	}
+
+	PCM_RELEASE(d);
+	PCM_UNLOCK(d);
+
+	PCM_GIANT_LEAVE(d);
+skip:
+	free(priv, M_DEVBUF);
+	priv = NULL;
+}
+
 #define DSP_FIXUP_ERROR()		do {				\
 	prio = dsp_get_flags(i_dev);					\
 	if (!DSP_F_VALID(flags))					\
 		error = EINVAL;						\
 	if (!DSP_F_DUPLEX(flags) &&					\
 	    ((DSP_F_READ(flags) && d->reccount == 0) ||			\
 	    (DSP_F_WRITE(flags) && d->playcount == 0)))			\
 		error = ENOTSUP;					\
 	else if (!DSP_F_DUPLEX(flags) && (prio & SD_F_SIMPLEX) &&	\
 	    ((DSP_F_READ(flags) && (prio & SD_F_PRIO_WR)) ||		\
 	    (DSP_F_WRITE(flags) && (prio & SD_F_PRIO_RD))))		\
 		error = EBUSY;						\
-	else if (DSP_REGISTERED(d, i_dev))				\
-		error = EBUSY;						\
 } while (0)
 
 static int
 dsp_open(struct cdev *i_dev, int flags, int mode, struct thread *td)
 {
+	struct dsp_cdevpriv *priv;
 	struct pcm_channel *rdch, *wrch;
 	struct snddev_info *d;
-	uint32_t fmt, spd, prio, volctl;
-	int i, error, rderror, wrerror, devtype, wdevunit, rdevunit;
+	uint32_t fmt, spd, prio;
+	int error, rderror, wrerror;
 
 	/* Kind of impossible.. */
 	if (i_dev == NULL || td == NULL)
 		return (ENODEV);
 
-	d = dsp_get_info(i_dev);
+	d = i_dev->si_drv1;
 	if (PCM_DETACHING(d) || !PCM_REGISTERED(d))
 		return (EBADF);
 
+	priv = malloc(sizeof(*priv), M_DEVBUF, M_WAITOK | M_ZERO);
+	priv->sc = d;
+	priv->rdch = NULL;
+	priv->wrch = NULL;
+	priv->volch = NULL;
+	priv->simplex = (dsp_get_flags(i_dev) & SD_F_SIMPLEX) ? 1 : 0;
+
+	error = devfs_set_cdevpriv(priv, dsp_close);
+	if (error != 0)
+		return (error);
+
 	PCM_GIANT_ENTER(d);
 
 	/* Lock snddev so nobody else can monkey with it. */
 	PCM_LOCK(d);
 	PCM_WAIT(d);
 
-	/*
-	 * Try to acquire cloned device before someone else pick it.
-	 * ENODEV means this is not a cloned droids.
-	 */
-	error = snd_clone_acquire(i_dev);
-	if (!(error == 0 || error == ENODEV)) {
-		DSP_FIXUP_ERROR();
-		PCM_UNLOCK(d);
-		PCM_GIANT_EXIT(d);
-		return (error);
-	}
-
 	error = 0;
 	DSP_FIXUP_ERROR();
-
 	if (error != 0) {
-		(void)snd_clone_release(i_dev);
 		PCM_UNLOCK(d);
 		PCM_GIANT_EXIT(d);
 		return (error);
 	}
 
 	/*
 	 * That is just enough. Acquire and unlock pcm lock so
 	 * the other will just have to wait until we finish doing
 	 * everything.
 	 */
 	PCM_ACQUIRE(d);
 	PCM_UNLOCK(d);
 
-	devtype = PCMDEV(i_dev);
-	wdevunit = -1;
-	rdevunit = -1;
-	fmt = 0;
-	spd = 0;
-	volctl = DSP_CDEV_VOLCTL_NONE;
-
-	for (i = 0; i < (sizeof(dsp_cdevs) / sizeof(dsp_cdevs[0])); i++) {
-		if (devtype != dsp_cdevs[i].type || dsp_cdevs[i].alias != NULL)
-			continue;
-		/*
-		 * Volume control only valid for DSPHW devices,
-		 * and it must be opened in opposite direction be it
-		 * simplex or duplex. Anything else will be handled
-		 * as usual.
-		 */
-		if (dsp_cdevs[i].query == DSP_CDEV_TYPE_WRONLY) {
-			if (dsp_cdevs[i].volctl != 0 &&
-			    DSP_F_READ(flags)) {
-				volctl = DSP_CDEV_VOLCTL_WRITE;
-				flags &= ~FREAD;
-				flags |= FWRITE;
-			}
-			if (DSP_F_READ(flags)) {
-				(void)snd_clone_release(i_dev);
-				PCM_RELEASE_QUICK(d);
-				PCM_GIANT_EXIT(d);
-				return (ENOTSUP);
-			}
-			wdevunit = dev2unit(i_dev);
-		} else if (dsp_cdevs[i].query == DSP_CDEV_TYPE_RDONLY) {
-			if (dsp_cdevs[i].volctl != 0 &&
-			    DSP_F_WRITE(flags)) {
-				volctl = DSP_CDEV_VOLCTL_READ;
-				flags &= ~FWRITE;
-				flags |= FREAD;
-			}
-			if (DSP_F_WRITE(flags)) {
-				(void)snd_clone_release(i_dev);
-				PCM_RELEASE_QUICK(d);
-				PCM_GIANT_EXIT(d);
-				return (ENOTSUP);
-			}
-			rdevunit = dev2unit(i_dev);
-		}
-		fmt = dsp_cdevs[i].fmt;
-		spd = dsp_cdevs[i].spd;
-		break;
-	}
-
-	/* No matching devtype? */
-	if (fmt == 0 || spd == 0)
-		panic("impossible devtype %d", devtype);
+	fmt = SND_FORMAT(AFMT_U8, 1, 0);
+	spd = DSP_DEFAULT_SPEED;
 
 	rdch = NULL;
 	wrch = NULL;
 	rderror = 0;
 	wrerror = 0;
 
-	/*
-	 * if we get here, the open request is valid- either:
-	 *   * we were previously not open
-	 *   * we were open for play xor record and the opener wants
-	 *     the non-open direction
-	 */
 	if (DSP_F_READ(flags)) {
 		/* open for read */
 		rderror = pcm_chnalloc(d, &rdch, PCMDIR_REC,
-		    td->td_proc->p_pid, td->td_proc->p_comm, rdevunit);
+		    td->td_proc->p_pid, td->td_proc->p_comm, -1);
 
 		if (rderror == 0 && chn_reset(rdch, fmt, spd) != 0)
 			rderror = ENXIO;
 
-		if (volctl == DSP_CDEV_VOLCTL_READ)
-			rderror = 0;
-
 		if (rderror != 0) {
 			if (rdch != NULL)
 				pcm_chnrelease(rdch);
 			if (!DSP_F_DUPLEX(flags)) {
-				(void)snd_clone_release(i_dev);
 				PCM_RELEASE_QUICK(d);
 				PCM_GIANT_EXIT(d);
 				return (rderror);
 			}
 			rdch = NULL;
-		} else if (volctl == DSP_CDEV_VOLCTL_READ) {
-			if (rdch != NULL) {
-				pcm_chnref(rdch, 1);
-				pcm_chnrelease(rdch);
-			}
 		} else {
 			if (flags & O_NONBLOCK)
 				rdch->flags |= CHN_F_NBIO;
 			if (flags & O_EXCL)
 				rdch->flags |= CHN_F_EXCLUSIVE;
 			pcm_chnref(rdch, 1);
-			if (volctl == DSP_CDEV_VOLCTL_NONE)
-				chn_vpc_reset(rdch, SND_VOL_C_PCM, 0);
+			chn_vpc_reset(rdch, SND_VOL_C_PCM, 0);
 		 	CHN_UNLOCK(rdch);
 		}
 	}
 
 	if (DSP_F_WRITE(flags)) {
 		/* open for write */
 		wrerror = pcm_chnalloc(d, &wrch, PCMDIR_PLAY,
-		    td->td_proc->p_pid, td->td_proc->p_comm, wdevunit);
+		    td->td_proc->p_pid, td->td_proc->p_comm, -1);
 
 		if (wrerror == 0 && chn_reset(wrch, fmt, spd) != 0)
 			wrerror = ENXIO;
 
-		if (volctl == DSP_CDEV_VOLCTL_WRITE)
-			wrerror = 0;
-
 		if (wrerror != 0) {
 			if (wrch != NULL)
 				pcm_chnrelease(wrch);
 			if (!DSP_F_DUPLEX(flags)) {
 				if (rdch != NULL) {
 					/*
 					 * Lock, deref and release previously
 					 * created record channel
 					 */
 					CHN_LOCK(rdch);
 					pcm_chnref(rdch, -1);
 					pcm_chnrelease(rdch);
 				}
-				(void)snd_clone_release(i_dev);
 				PCM_RELEASE_QUICK(d);
 				PCM_GIANT_EXIT(d);
 				return (wrerror);
 			}
 			wrch = NULL;
-		} else if (volctl == DSP_CDEV_VOLCTL_WRITE) {
-			if (wrch != NULL) {
-				pcm_chnref(wrch, 1);
-				pcm_chnrelease(wrch);
-			}
 		} else {
 			if (flags & O_NONBLOCK)
 				wrch->flags |= CHN_F_NBIO;
 			if (flags & O_EXCL)
 				wrch->flags |= CHN_F_EXCLUSIVE;
 			pcm_chnref(wrch, 1);
-			if (volctl == DSP_CDEV_VOLCTL_NONE)
-				chn_vpc_reset(wrch, SND_VOL_C_PCM, 0);
+			chn_vpc_reset(wrch, SND_VOL_C_PCM, 0);
 			CHN_UNLOCK(wrch);
 		}
 	}
 
 	PCM_LOCK(d);
 
-	/*
-	 * We're done. Allocate channels information for this cdev.
-	 */
-	switch (volctl) {
-	case DSP_CDEV_VOLCTL_READ:
-		KASSERT(wrch == NULL, ("wrch=%p not null!", wrch));
-		dsp_cdevinfo_alloc(i_dev, NULL, NULL, rdch);
-		break;
-	case DSP_CDEV_VOLCTL_WRITE:
-		KASSERT(rdch == NULL, ("rdch=%p not null!", rdch));
-		dsp_cdevinfo_alloc(i_dev, NULL, NULL, wrch);
-		break;
-	case DSP_CDEV_VOLCTL_NONE:
-	default:
-		if (wrch == NULL && rdch == NULL) {
-			(void)snd_clone_release(i_dev);
-			PCM_RELEASE(d);
-			PCM_UNLOCK(d);
-			PCM_GIANT_EXIT(d);
-			if (wrerror != 0)
-				return (wrerror);
-			if (rderror != 0)
-				return (rderror);
-			return (EINVAL);
-		}
-		dsp_cdevinfo_alloc(i_dev, rdch, wrch, NULL);
-		if (rdch != NULL)
-			CHN_INSERT_HEAD(d, rdch, channels.pcm.opened);
-		if (wrch != NULL)
-			CHN_INSERT_HEAD(d, wrch, channels.pcm.opened);
-		break;
-	}
-
-	/*
-	 * Increase clone refcount for its automatic garbage collector.
-	 */
-	(void)snd_clone_ref(i_dev);
-
-	PCM_RELEASE(d);
-	PCM_UNLOCK(d);
-
-	PCM_GIANT_LEAVE(d);
-
-	return (0);
-}
-
-static int
-dsp_close(struct cdev *i_dev, int flags, int mode, struct thread *td)
-{
-	struct pcm_channel *rdch, *wrch, *volch;
-	struct snddev_info *d;
-	int sg_ids, rdref, wdref;
-
-	d = dsp_get_info(i_dev);
-	if (!DSP_REGISTERED(d, i_dev))
-		return (EBADF);
-
-	PCM_GIANT_ENTER(d);
-
-	PCM_LOCK(d);
-	PCM_WAIT(d);
-	PCM_ACQUIRE(d);
-
-	rdch = PCM_RDCH(i_dev);
-	wrch = PCM_WRCH(i_dev);
-	volch = PCM_VOLCH(i_dev);
-
-	PCM_RDCH(i_dev) = NULL;
-	PCM_WRCH(i_dev) = NULL;
-	PCM_VOLCH(i_dev) = NULL;
-
-	rdref = -1;
-	wdref = -1;
-
-	if (volch != NULL) {
-		if (volch == rdch)
-			rdref--;
-		else if (volch == wrch)
-			wdref--;
-		else {
-			CHN_LOCK(volch);
-			pcm_chnref(volch, -1);
-			CHN_UNLOCK(volch);
-		}
+	if (wrch == NULL && rdch == NULL) {
+		PCM_RELEASE(d);
+		PCM_UNLOCK(d);
+		PCM_GIANT_EXIT(d);
+		if (wrerror != 0)
+			return (wrerror);
+		if (rderror != 0)
+			return (rderror);
+		return (EINVAL);
 	}
-
 	if (rdch != NULL)
-		CHN_REMOVE(d, rdch, channels.pcm.opened);
+		CHN_INSERT_HEAD(d, rdch, channels.pcm.opened);
 	if (wrch != NULL)
-		CHN_REMOVE(d, wrch, channels.pcm.opened);
-
-	if (rdch != NULL || wrch != NULL) {
-		PCM_UNLOCK(d);
-		if (rdch != NULL) {
-			/*
-			 * The channel itself need not be locked because:
-			 *   a)  Adding a channel to a syncgroup happens only
-			 *       in dsp_ioctl(), which cannot run concurrently
-			 *       to dsp_close().
-			 *   b)  The syncmember pointer (sm) is protected by
-			 *       the global syncgroup list lock.
-			 *   c)  A channel can't just disappear, invalidating
-			 *       pointers, unless it's closed/dereferenced
-			 *       first.
-			 */
-			PCM_SG_LOCK();
-			sg_ids = chn_syncdestroy(rdch);
-			PCM_SG_UNLOCK();
-			if (sg_ids != 0)
-				free_unr(pcmsg_unrhdr, sg_ids);
-
-			CHN_LOCK(rdch);
-			pcm_chnref(rdch, rdref);
-			chn_abort(rdch); /* won't sleep */
-			rdch->flags &= ~(CHN_F_RUNNING | CHN_F_MMAP |
-			    CHN_F_DEAD | CHN_F_EXCLUSIVE);
-			chn_reset(rdch, 0, 0);
-			pcm_chnrelease(rdch);
-		}
-		if (wrch != NULL) {
-			/*
-			 * Please see block above.
-			 */
-			PCM_SG_LOCK();
-			sg_ids = chn_syncdestroy(wrch);
-			PCM_SG_UNLOCK();
-			if (sg_ids != 0)
-				free_unr(pcmsg_unrhdr, sg_ids);
-
-			CHN_LOCK(wrch);
-			pcm_chnref(wrch, wdref);
-			chn_flush(wrch); /* may sleep */
-			wrch->flags &= ~(CHN_F_RUNNING | CHN_F_MMAP |
-			    CHN_F_DEAD | CHN_F_EXCLUSIVE);
-			chn_reset(wrch, 0, 0);
-			pcm_chnrelease(wrch);
-		}
-		PCM_LOCK(d);
-	}
-
-	dsp_cdevinfo_free(i_dev);
-	/*
-	 * Release clone busy state and unref it so the automatic
-	 * garbage collector will get the hint and do the remaining
-	 * cleanup process.
-	 */
-	(void)snd_clone_release(i_dev);
-
-	/*
-	 * destroy_dev() might sleep, so release pcm lock
-	 * here and rely on pcm cv serialization.
-	 */
-	PCM_UNLOCK(d);
-	(void)snd_clone_unref(i_dev);
-	PCM_LOCK(d);
+		CHN_INSERT_HEAD(d, wrch, channels.pcm.opened);
+	priv->rdch = rdch;
+	priv->wrch = wrch;
 
 	PCM_RELEASE(d);
 	PCM_UNLOCK(d);
 
 	PCM_GIANT_LEAVE(d);
 
 	return (0);
 }
 
 static __inline int
-dsp_io_ops(struct cdev *i_dev, struct uio *buf)
+dsp_io_ops(struct dsp_cdevpriv *priv, struct uio *buf)
 {
 	struct snddev_info *d;
-	struct pcm_channel **ch, *rdch, *wrch;
+	struct pcm_channel **ch;
 	int (*chn_io)(struct pcm_channel *, struct uio *);
 	int prio, ret;
 	pid_t runpid;
 
-	KASSERT(i_dev != NULL && buf != NULL &&
+	KASSERT(buf != NULL &&
 	    (buf->uio_rw == UIO_READ || buf->uio_rw == UIO_WRITE),
 	    ("%s(): io train wreck!", __func__));
 
-	d = dsp_get_info(i_dev);
-	if (PCM_DETACHING(d) || !DSP_REGISTERED(d, i_dev))
+	d = priv->sc;
+	if (PCM_DETACHING(d) || !DSP_REGISTERED(d))
 		return (EBADF);
 
 	PCM_GIANT_ENTER(d);
 
 	switch (buf->uio_rw) {
 	case UIO_READ:
 		prio = SD_F_PRIO_RD;
-		ch = &rdch;
+		ch = &priv->rdch;
 		chn_io = chn_read;
 		break;
 	case UIO_WRITE:
 		prio = SD_F_PRIO_WR;
-		ch = &wrch;
+		ch = &priv->wrch;
 		chn_io = chn_write;
 		break;
 	default:
 		panic("invalid/corrupted uio direction: %d", buf->uio_rw);
 		break;
 	}
 
-	rdch = NULL;
-	wrch = NULL;
 	runpid = buf->uio_td->td_proc->p_pid;
 
-	getchns(i_dev, &rdch, &wrch, prio);
+	getchns(priv, prio);
 
 	if (*ch == NULL || !((*ch)->flags & CHN_F_BUSY)) {
-		if (rdch != NULL || wrch != NULL)
-			relchns(i_dev, rdch, wrch, prio);
+		if (priv->rdch != NULL || priv->wrch != NULL)
+			relchns(priv, prio);
 		PCM_GIANT_EXIT(d);
 		return (EBADF);
 	}
 
 	if (((*ch)->flags & (CHN_F_MMAP | CHN_F_DEAD)) ||
 	    (((*ch)->flags & CHN_F_RUNNING) && (*ch)->pid != runpid)) {
-		relchns(i_dev, rdch, wrch, prio);
+		relchns(priv, prio);
 		PCM_GIANT_EXIT(d);
 		return (EINVAL);
 	} else if (!((*ch)->flags & CHN_F_RUNNING)) {
 		(*ch)->flags |= CHN_F_RUNNING;
 		(*ch)->pid = runpid;
 	}
 
 	/*
 	 * chn_read/write must give up channel lock in order to copy bytes
 	 * from/to userland, so up the "in progress" counter to make sure
 	 * someone else doesn't come along and muss up the buffer.
 	 */
 	++(*ch)->inprog;
 	ret = chn_io(*ch, buf);
 	--(*ch)->inprog;
 
 	CHN_BROADCAST(&(*ch)->cv);
 
-	relchns(i_dev, rdch, wrch, prio);
+	relchns(priv, prio);
 
 	PCM_GIANT_LEAVE(d);
 
 	return (ret);
 }
 
 static int
 dsp_read(struct cdev *i_dev, struct uio *buf, int flag)
 {
-	return (dsp_io_ops(i_dev, buf));
+	struct dsp_cdevpriv *priv;
+	int err;
+
+	if ((err = devfs_get_cdevpriv((void **)&priv)) != 0)
+		return (err);
+	return (dsp_io_ops(priv, buf));
 }
 
 static int
 dsp_write(struct cdev *i_dev, struct uio *buf, int flag)
 {
-	return (dsp_io_ops(i_dev, buf));
+	struct dsp_cdevpriv *priv;
+	int err;
+
+	if ((err = devfs_get_cdevpriv((void **)&priv)) != 0)
+		return (err);
+	return (dsp_io_ops(priv, buf));
 }
 
 static int
-dsp_get_volume_channel(struct cdev *dev, struct pcm_channel **volch)
+dsp_get_volume_channel(struct dsp_cdevpriv *priv, struct pcm_channel **volch)
 {
 	struct snddev_info *d;
 	struct pcm_channel *c;
 	int unit;
 
-	KASSERT(dev != NULL && volch != NULL,
-	    ("%s(): NULL query dev=%p volch=%p", __func__, dev, volch));
+	KASSERT(volch != NULL,
+	    ("%s(): NULL query priv=%p volch=%p", __func__, priv, volch));
 
-	d = dsp_get_info(dev);
+	d = priv->sc;
 	if (!PCM_REGISTERED(d)) {
 		*volch = NULL;
 		return (EINVAL);
 	}
 
 	PCM_UNLOCKASSERT(d);
 
 	*volch = NULL;
 
-	c = PCM_VOLCH(dev);
+	c = priv->volch;
 	if (c != NULL) {
 		if (!(c->feederflags & (1 << FEEDER_VOLUME)))
 			return (-1);
 		*volch = c;
 		return (0);
 	}
 
 	PCM_LOCK(d);
 	PCM_WAIT(d);
 	PCM_ACQUIRE(d);
 
-	unit = dev2unit(dev);
+	unit = dev2unit(d->dsp_dev);
 
 	CHN_FOREACH(c, d, channels.pcm) {
 		CHN_LOCK(c);
 		if (c->unit != unit) {
 			CHN_UNLOCK(c);
 			continue;
 		}
 		*volch = c;
 		pcm_chnref(c, 1);
-		PCM_VOLCH(dev) = c;
+		priv->volch = c;
 		CHN_UNLOCK(c);
 		PCM_RELEASE(d);
 		PCM_UNLOCK(d);
 		return ((c->feederflags & (1 << FEEDER_VOLUME)) ? 0 : -1);
 	}
 
 	PCM_RELEASE(d);
 	PCM_UNLOCK(d);
 
 	return (EINVAL);
 }
 
 static int
-dsp_ioctl_channel(struct cdev *dev, struct pcm_channel *volch, u_long cmd,
-    caddr_t arg)
+dsp_ioctl_channel(struct dsp_cdevpriv *priv, struct pcm_channel *volch,
+    u_long cmd, caddr_t arg)
 {
 	struct snddev_info *d;
 	struct pcm_channel *rdch, *wrch;
 	int j, devtype, ret;
 	int left, right, center, mute;
 
-	d = dsp_get_info(dev);
-	if (!PCM_REGISTERED(d) || !(dsp_get_flags(dev) & SD_F_VPC))
+	d = priv->sc;
+	if (!PCM_REGISTERED(d) || !(dsp_get_flags(d->dsp_dev) & SD_F_VPC))
 		return (-1);
 
 	PCM_UNLOCKASSERT(d);
 
 	j = cmd & 0xff;
 
-	rdch = PCM_RDCH(dev);
-	wrch = PCM_WRCH(dev);
+	rdch = priv->rdch;
+	wrch = priv->wrch;
 
 	/* No specific channel, look into cache */
 	if (volch == NULL)
-		volch = PCM_VOLCH(dev);
+		volch = priv->volch;
 
 	/* Look harder */
 	if (volch == NULL) {
 		if (j == SOUND_MIXER_RECLEV && rdch != NULL)
 			volch = rdch;
 		else if (j == SOUND_MIXER_PCM && wrch != NULL)
 			volch = wrch;
 	}
 
-	devtype = PCMDEV(dev);
+	devtype = PCMDEV(d->dsp_dev);
 
 	/* Look super harder */
 	if (volch == NULL &&
 	    (devtype == SND_DEV_DSPHW_PLAY || devtype == SND_DEV_DSPHW_VPLAY ||
 	    devtype == SND_DEV_DSPHW_REC || devtype == SND_DEV_DSPHW_VREC)) {
-		ret = dsp_get_volume_channel(dev, &volch);
+		ret = dsp_get_volume_channel(priv, &volch);
 		if (ret != 0)
 			return (ret);
 		if (volch == NULL)
 			return (EINVAL);
 	}
 
 	/* Final validation */
 	if (volch == NULL)
 		return (EINVAL);
 
 	CHN_LOCK(volch);
 	if (!(volch->feederflags & (1 << FEEDER_VOLUME))) {
 		CHN_UNLOCK(volch);
 		return (EINVAL);
 	}
 
 	switch (cmd & ~0xff) {
 	case MIXER_WRITE(0):
 		switch (j) {
 		case SOUND_MIXER_MUTE:
 			if (volch->direction == PCMDIR_REC) {
 				chn_setmute_multi(volch, SND_VOL_C_PCM, (*(int *)arg & SOUND_MASK_RECLEV) != 0);
 			} else {
 				chn_setmute_multi(volch, SND_VOL_C_PCM, (*(int *)arg & SOUND_MASK_PCM) != 0);
 			}
 			break;
 		case SOUND_MIXER_PCM:
 			if (volch->direction != PCMDIR_PLAY)
 				break;
 			left = *(int *)arg & 0x7f;
 			right = ((*(int *)arg) >> 8) & 0x7f;
 			center = (left + right) >> 1;
 			chn_setvolume_multi(volch, SND_VOL_C_PCM,
 			    left, right, center);
 			break;
 		case SOUND_MIXER_RECLEV:
 			if (volch->direction != PCMDIR_REC)
 				break;
 			left = *(int *)arg & 0x7f;
 			right = ((*(int *)arg) >> 8) & 0x7f;
 			center = (left + right) >> 1;
 			chn_setvolume_multi(volch, SND_VOL_C_PCM,
 			    left, right, center);
 			break;
 		default:
 			/* ignore all other mixer writes */
 			break;
 		}
 		break;
 
 	case MIXER_READ(0):
 		switch (j) {
 		case SOUND_MIXER_MUTE:
 			mute = CHN_GETMUTE(volch, SND_VOL_C_PCM, SND_CHN_T_FL) ||
 			    CHN_GETMUTE(volch, SND_VOL_C_PCM, SND_CHN_T_FR);
 			if (volch->direction == PCMDIR_REC) {
 				*(int *)arg = mute << SOUND_MIXER_RECLEV;
 			} else {
 				*(int *)arg = mute << SOUND_MIXER_PCM;
 			}
 			break;
 		case SOUND_MIXER_PCM:
 			if (volch->direction != PCMDIR_PLAY)
 				break;
 			*(int *)arg = CHN_GETVOLUME(volch,
 			    SND_VOL_C_PCM, SND_CHN_T_FL);
 			*(int *)arg |= CHN_GETVOLUME(volch,
 			    SND_VOL_C_PCM, SND_CHN_T_FR) << 8;
 			break;
 		case SOUND_MIXER_RECLEV:
 			if (volch->direction != PCMDIR_REC)
 				break;
 			*(int *)arg = CHN_GETVOLUME(volch,
 			    SND_VOL_C_PCM, SND_CHN_T_FL);
 			*(int *)arg |= CHN_GETVOLUME(volch,
 			    SND_VOL_C_PCM, SND_CHN_T_FR) << 8;
 			break;
 		case SOUND_MIXER_DEVMASK:
 		case SOUND_MIXER_CAPS:
 		case SOUND_MIXER_STEREODEVS:
 			if (volch->direction == PCMDIR_REC)
 				*(int *)arg = SOUND_MASK_RECLEV;
 			else
 				*(int *)arg = SOUND_MASK_PCM;
 			break;
 		default:
 			*(int *)arg = 0;
 			break;
 		}
 		break;
 
 	default:
 		break;
 	}
 	CHN_UNLOCK(volch);
 	return (0);
 }
 
 static int
 dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
     struct thread *td)
 {
+	struct dsp_cdevpriv *priv;
     	struct pcm_channel *chn, *rdch, *wrch;
 	struct snddev_info *d;
 	u_long xcmd;
-	int *arg_i, ret, tmp;
+	int *arg_i, ret, tmp, err;
+
+	if ((err = devfs_get_cdevpriv((void **)&priv)) != 0)
+		return (err);
 
-	d = dsp_get_info(i_dev);
-	if (PCM_DETACHING(d) || !DSP_REGISTERED(d, i_dev))
+	d = priv->sc;
+	if (PCM_DETACHING(d) || !DSP_REGISTERED(d))
 		return (EBADF);
 
 	PCM_GIANT_ENTER(d);
 
 	arg_i = (int *)arg;
 	ret = 0;
 	xcmd = 0;
 	chn = NULL;
 
 	if (IOCGROUP(cmd) == 'M') {
 		if (cmd == OSS_GETVERSION) {
 			*arg_i = SOUND_VERSION;
 			PCM_GIANT_EXIT(d);
 			return (0);
 		}
-		ret = dsp_ioctl_channel(i_dev, PCM_VOLCH(i_dev), cmd, arg);
+		ret = dsp_ioctl_channel(priv, priv->volch, cmd, arg);
 		if (ret != -1) {
 			PCM_GIANT_EXIT(d);
 			return (ret);
 		}
 
 		if (d->mixer_dev != NULL) {
 			PCM_ACQUIRE_QUICK(d);
 			ret = mixer_ioctl_cmd(d->mixer_dev, cmd, arg, -1, td,
 			    MIXER_CMD_DIRECT);
 			PCM_RELEASE_QUICK(d);
 		} else
 			ret = EBADF;
 
 		PCM_GIANT_EXIT(d);
 
 		return (ret);
 	}
 
 	/*
 	 * Certain ioctls may be made on any type of device (audio, mixer,
 	 * and MIDI).  Handle those special cases here.
 	 */
 	if (IOCGROUP(cmd) == 'X') {
 		PCM_ACQUIRE_QUICK(d);
 		switch(cmd) {
 		case SNDCTL_SYSINFO:
 			sound_oss_sysinfo((oss_sysinfo *)arg);
 			break;
 		case SNDCTL_CARDINFO:
 			ret = sound_oss_card_info((oss_card_info *)arg);
 			break;
 		case SNDCTL_AUDIOINFO:
 		case SNDCTL_AUDIOINFO_EX:
 		case SNDCTL_ENGINEINFO:
 			ret = dsp_oss_audioinfo(i_dev, (oss_audioinfo *)arg);
 			break;
 		case SNDCTL_MIXERINFO:
 			ret = mixer_oss_mixerinfo(i_dev, (oss_mixerinfo *)arg);
 			break;
 		default:
 			ret = EINVAL;
 		}
 		PCM_RELEASE_QUICK(d);
 		PCM_GIANT_EXIT(d);
 		return (ret);
 	}
 
-	getchns(i_dev, &rdch, &wrch, 0);
+	getchns(priv, 0);
+	rdch = priv->rdch;
+	wrch = priv->wrch;
 
 	if (wrch != NULL && (wrch->flags & CHN_F_DEAD))
 		wrch = NULL;
 	if (rdch != NULL && (rdch->flags & CHN_F_DEAD))
 		rdch = NULL;
 
 	if (wrch == NULL && rdch == NULL) {
 		PCM_GIANT_EXIT(d);
 		return (EINVAL);
 	}
 
     	switch(cmd) {
 #ifdef OLDPCM_IOCTL
     	/*
      	 * we start with the new ioctl interface.
      	 */
     	case AIONWRITE:	/* how many bytes can write ? */
 		if (wrch) {
 			CHN_LOCK(wrch);
 /*
 		if (wrch && wrch->bufhard.dl)
 			while (chn_wrfeed(wrch) == 0);
 */
 			*arg_i = sndbuf_getfree(wrch->bufsoft);
 			CHN_UNLOCK(wrch);
 		} else {
 			*arg_i = 0;
 			ret = EINVAL;
 		}
 		break;
 
     	case AIOSSIZE:     /* set the current blocksize */
 		{
 	    		struct snd_size *p = (struct snd_size *)arg;
 
 			p->play_size = 0;
 			p->rec_size = 0;
 			PCM_ACQUIRE_QUICK(d);
 	    		if (wrch) {
 				CHN_LOCK(wrch);
 				chn_setblocksize(wrch, 2, p->play_size);
 				p->play_size = sndbuf_getblksz(wrch->bufsoft);
 				CHN_UNLOCK(wrch);
 			}
 	    		if (rdch) {
 				CHN_LOCK(rdch);
 				chn_setblocksize(rdch, 2, p->rec_size);
 				p->rec_size = sndbuf_getblksz(rdch->bufsoft);
 				CHN_UNLOCK(rdch);
 			}
 			PCM_RELEASE_QUICK(d);
 		}
 		break;
     	case AIOGSIZE:	/* get the current blocksize */
 		{
 	    		struct snd_size *p = (struct snd_size *)arg;
 
 	    		if (wrch) {
 				CHN_LOCK(wrch);
 				p->play_size = sndbuf_getblksz(wrch->bufsoft);
 				CHN_UNLOCK(wrch);
 			}
 	    		if (rdch) {
 				CHN_LOCK(rdch);
 				p->rec_size = sndbuf_getblksz(rdch->bufsoft);
 				CHN_UNLOCK(rdch);
 			}
 		}
 		break;
 
     	case AIOSFMT:
     	case AIOGFMT:
 		{
 	    		snd_chan_param *p = (snd_chan_param *)arg;
 
 			if (cmd == AIOSFMT &&
 			    ((p->play_format != 0 && p->play_rate == 0) ||
 			    (p->rec_format != 0 && p->rec_rate == 0))) {
 				ret = EINVAL;
 				break;
 			}
 			PCM_ACQUIRE_QUICK(d);
 	    		if (wrch) {
 				CHN_LOCK(wrch);
 				if (cmd == AIOSFMT && p->play_format != 0) {
 					chn_setformat(wrch,
 					    SND_FORMAT(p->play_format,
 					    AFMT_CHANNEL(wrch->format),
 					    AFMT_EXTCHANNEL(wrch->format)));
 					chn_setspeed(wrch, p->play_rate);
 				}
 	    			p->play_rate = wrch->speed;
 	    			p->play_format = AFMT_ENCODING(wrch->format);
 				CHN_UNLOCK(wrch);
 			} else {
 	    			p->play_rate = 0;
 	    			p->play_format = 0;
 	    		}
 	    		if (rdch) {
 				CHN_LOCK(rdch);
 				if (cmd == AIOSFMT && p->rec_format != 0) {
 					chn_setformat(rdch,
 					    SND_FORMAT(p->rec_format,
 					    AFMT_CHANNEL(rdch->format),
 					    AFMT_EXTCHANNEL(rdch->format)));
 					chn_setspeed(rdch, p->rec_rate);
 				}
 				p->rec_rate = rdch->speed;
 				p->rec_format = AFMT_ENCODING(rdch->format);
 				CHN_UNLOCK(rdch);
 			} else {
 	    			p->rec_rate = 0;
 	    			p->rec_format = 0;
 	    		}
 			PCM_RELEASE_QUICK(d);
 		}
 		break;
 
     	case AIOGCAP:     /* get capabilities */
 		{
 	    		snd_capabilities *p = (snd_capabilities *)arg;
 			struct pcmchan_caps *pcaps = NULL, *rcaps = NULL;
 			struct cdev *pdev;
 
 			PCM_LOCK(d);
 			if (rdch) {
 				CHN_LOCK(rdch);
 				rcaps = chn_getcaps(rdch);
 			}
 			if (wrch) {
 				CHN_LOCK(wrch);
 				pcaps = chn_getcaps(wrch);
 			}
 	    		p->rate_min = max(rcaps? rcaps->minspeed : 0,
 	                      		  pcaps? pcaps->minspeed : 0);
 	    		p->rate_max = min(rcaps? rcaps->maxspeed : 1000000,
 	                      		  pcaps? pcaps->maxspeed : 1000000);
 	    		p->bufsize = min(rdch? sndbuf_getsize(rdch->bufsoft) : 1000000,
 	                     		 wrch? sndbuf_getsize(wrch->bufsoft) : 1000000);
 			/* XXX bad on sb16 */
 	    		p->formats = (rdch? chn_getformats(rdch) : 0xffffffff) &
 			 	     (wrch? chn_getformats(wrch) : 0xffffffff);
 			if (rdch && wrch)
 				p->formats |= (dsp_get_flags(i_dev) & SD_F_SIMPLEX)? 0 : AFMT_FULLDUPLEX;
 			pdev = d->mixer_dev;
 	    		p->mixers = 1; /* default: one mixer */
 	    		p->inputs = pdev->si_drv1? mix_getdevs(pdev->si_drv1) : 0;
 	    		p->left = p->right = 100;
 			if (wrch)
 				CHN_UNLOCK(wrch);
 			if (rdch)
 				CHN_UNLOCK(rdch);
 			PCM_UNLOCK(d);
 		}
 		break;
 
     	case AIOSTOP:
 		if (*arg_i == AIOSYNC_PLAY && wrch) {
 			CHN_LOCK(wrch);
 			*arg_i = chn_abort(wrch);
 			CHN_UNLOCK(wrch);
 		} else if (*arg_i == AIOSYNC_CAPTURE && rdch) {
 			CHN_LOCK(rdch);
 			*arg_i = chn_abort(rdch);
 			CHN_UNLOCK(rdch);
 		} else {
 	   	 	printf("AIOSTOP: bad channel 0x%x\n", *arg_i);
 	    		*arg_i = 0;
 		}
 		break;
 
     	case AIOSYNC:
 		printf("AIOSYNC chan 0x%03lx pos %lu unimplemented\n",
 	    		((snd_sync_parm *)arg)->chan, ((snd_sync_parm *)arg)->pos);
 		break;
 #endif
 	/*
 	 * here follow the standard ioctls (filio.h etc.)
 	 */
     	case FIONREAD: /* get # bytes to read */
 		if (rdch) {
 			CHN_LOCK(rdch);
 /*			if (rdch && rdch->bufhard.dl)
 				while (chn_rdfeed(rdch) == 0);
 */
 			*arg_i = sndbuf_getready(rdch->bufsoft);
 			CHN_UNLOCK(rdch);
 		} else {
 			*arg_i = 0;
 			ret = EINVAL;
 		}
 		break;
 
     	case FIOASYNC: /*set/clear async i/o */
 		DEB( printf("FIOASYNC\n") ; )
 		break;
 
     	case SNDCTL_DSP_NONBLOCK: /* set non-blocking i/o */
     	case FIONBIO: /* set/clear non-blocking i/o */
 		if (rdch) {
 			CHN_LOCK(rdch);
 			if (cmd == SNDCTL_DSP_NONBLOCK || *arg_i)
 				rdch->flags |= CHN_F_NBIO;
 			else
 				rdch->flags &= ~CHN_F_NBIO;
 			CHN_UNLOCK(rdch);
 		}
 		if (wrch) {
 			CHN_LOCK(wrch);
 			if (cmd == SNDCTL_DSP_NONBLOCK || *arg_i)
 				wrch->flags |= CHN_F_NBIO;
 			else
 				wrch->flags &= ~CHN_F_NBIO;
 			CHN_UNLOCK(wrch);
 		}
 		break;
 
     	/*
 	 * Finally, here is the linux-compatible ioctl interface
 	 */
 #define THE_REAL_SNDCTL_DSP_GETBLKSIZE _IOWR('P', 4, int)
     	case THE_REAL_SNDCTL_DSP_GETBLKSIZE:
     	case SNDCTL_DSP_GETBLKSIZE:
 		chn = wrch ? wrch : rdch;
 		if (chn) {
 			CHN_LOCK(chn);
 			*arg_i = sndbuf_getblksz(chn->bufsoft);
 			CHN_UNLOCK(chn);
 		} else {
 			*arg_i = 0;
 			ret = EINVAL;
 		}
 		break;
 
     	case SNDCTL_DSP_SETBLKSIZE:
 		RANGE(*arg_i, 16, 65536);
 		PCM_ACQUIRE_QUICK(d);
 		if (wrch) {
 			CHN_LOCK(wrch);
 			chn_setblocksize(wrch, 2, *arg_i);
 			CHN_UNLOCK(wrch);
 		}
 		if (rdch) {
 			CHN_LOCK(rdch);
 			chn_setblocksize(rdch, 2, *arg_i);
 			CHN_UNLOCK(rdch);
 		}
 		PCM_RELEASE_QUICK(d);
 		break;
 
     	case SNDCTL_DSP_RESET:
 		DEB(printf("dsp reset\n"));
 		if (wrch) {
 			CHN_LOCK(wrch);
 			chn_abort(wrch);
 			chn_resetbuf(wrch);
 			CHN_UNLOCK(wrch);
 		}
 		if (rdch) {
 			CHN_LOCK(rdch);
 			chn_abort(rdch);
 			chn_resetbuf(rdch);
 			CHN_UNLOCK(rdch);
 		}
 		break;
 
     	case SNDCTL_DSP_SYNC:
 		DEB(printf("dsp sync\n"));
 		/* chn_sync may sleep */
 		if (wrch) {
 			CHN_LOCK(wrch);
 			chn_sync(wrch, 0);
 			CHN_UNLOCK(wrch);
 		}
 		break;
 
     	case SNDCTL_DSP_SPEED:
 		/* chn_setspeed may sleep */
 		tmp = 0;
 		PCM_ACQUIRE_QUICK(d);
 		if (wrch) {
 			CHN_LOCK(wrch);
 			ret = chn_setspeed(wrch, *arg_i);
 			tmp = wrch->speed;
 			CHN_UNLOCK(wrch);
 		}
 		if (rdch && ret == 0) {
 			CHN_LOCK(rdch);
 			ret = chn_setspeed(rdch, *arg_i);
 			if (tmp == 0)
 				tmp = rdch->speed;
 			CHN_UNLOCK(rdch);
 		}
 		PCM_RELEASE_QUICK(d);
 		*arg_i = tmp;
 		break;
 
     	case SOUND_PCM_READ_RATE:
 		chn = wrch ? wrch : rdch;
 		if (chn) {
 			CHN_LOCK(chn);
 			*arg_i = chn->speed;
 			CHN_UNLOCK(chn);
 		} else {
 			*arg_i = 0;
 			ret = EINVAL;
 		}
 		break;
 
     	case SNDCTL_DSP_STEREO:
 		tmp = -1;
 		*arg_i = (*arg_i)? 2 : 1;
 		PCM_ACQUIRE_QUICK(d);
 		if (wrch) {
 			CHN_LOCK(wrch);
 			ret = chn_setformat(wrch,
 			    SND_FORMAT(wrch->format, *arg_i, 0));
 			tmp = (AFMT_CHANNEL(wrch->format) > 1)? 1 : 0;
 			CHN_UNLOCK(wrch);
 		}
 		if (rdch && ret == 0) {
 			CHN_LOCK(rdch);
 			ret = chn_setformat(rdch,
 			    SND_FORMAT(rdch->format, *arg_i, 0));
 			if (tmp == -1)
 				tmp = (AFMT_CHANNEL(rdch->format) > 1)? 1 : 0;
 			CHN_UNLOCK(rdch);
 		}
 		PCM_RELEASE_QUICK(d);
 		*arg_i = tmp;
 		break;
 
     	case SOUND_PCM_WRITE_CHANNELS:
 /*	case SNDCTL_DSP_CHANNELS: ( == SOUND_PCM_WRITE_CHANNELS) */
 		if (*arg_i < 0 || *arg_i > AFMT_CHANNEL_MAX) {
 			*arg_i = 0;
 			ret = EINVAL;
 			break;
 		}
 		if (*arg_i != 0) {
 			uint32_t ext = 0;
 
 			tmp = 0;
 			/*
 			 * Map channel number to surround sound formats.
 			 * Devices that need bitperfect mode to operate
 			 * (e.g. more than SND_CHN_MAX channels) are not
 			 * subject to any mapping.
 			 */
 			if (!(dsp_get_flags(i_dev) & SD_F_BITPERFECT)) {
 				struct pcmchan_matrix *m;
 
 				if (*arg_i > SND_CHN_MAX)
 					*arg_i = SND_CHN_MAX;
 
 				m = feeder_matrix_default_channel_map(*arg_i);
 				if (m != NULL)
 					ext = m->ext;
 			}
 
 			PCM_ACQUIRE_QUICK(d);
 	  		if (wrch) {
 				CHN_LOCK(wrch);
 				ret = chn_setformat(wrch,
 				    SND_FORMAT(wrch->format, *arg_i, ext));
 				tmp = AFMT_CHANNEL(wrch->format);
 				CHN_UNLOCK(wrch);
 			}
 			if (rdch && ret == 0) {
 				CHN_LOCK(rdch);
 				ret = chn_setformat(rdch,
 				    SND_FORMAT(rdch->format, *arg_i, ext));
 				if (tmp == 0)
 					tmp = AFMT_CHANNEL(rdch->format);
 				CHN_UNLOCK(rdch);
 			}
 			PCM_RELEASE_QUICK(d);
 			*arg_i = tmp;
 		} else {
 			chn = wrch ? wrch : rdch;
 			CHN_LOCK(chn);
 			*arg_i = AFMT_CHANNEL(chn->format);
 			CHN_UNLOCK(chn);
 		}
 		break;
 
     	case SOUND_PCM_READ_CHANNELS:
 		chn = wrch ? wrch : rdch;
 		if (chn) {
 			CHN_LOCK(chn);
 			*arg_i = AFMT_CHANNEL(chn->format);
 			CHN_UNLOCK(chn);
 		} else {
 			*arg_i = 0;
 			ret = EINVAL;
 		}
 		break;
 
     	case SNDCTL_DSP_GETFMTS:	/* returns a mask of supported fmts */
 		chn = wrch ? wrch : rdch;
 		if (chn) {
 			CHN_LOCK(chn);
 			*arg_i = chn_getformats(chn);
 			CHN_UNLOCK(chn);
 		} else {
 			*arg_i = 0;
 			ret = EINVAL;
 		}
 		break;
 
     	case SNDCTL_DSP_SETFMT:	/* sets _one_ format */
 		if (*arg_i != AFMT_QUERY) {
 			tmp = 0;
 			PCM_ACQUIRE_QUICK(d);
 			if (wrch) {
 				CHN_LOCK(wrch);
 				ret = chn_setformat(wrch, SND_FORMAT(*arg_i,
 				    AFMT_CHANNEL(wrch->format),
 				    AFMT_EXTCHANNEL(wrch->format)));
 				tmp = wrch->format;
 				CHN_UNLOCK(wrch);
 			}
 			if (rdch && ret == 0) {
 				CHN_LOCK(rdch);
 				ret = chn_setformat(rdch, SND_FORMAT(*arg_i,
 				    AFMT_CHANNEL(rdch->format),
 				    AFMT_EXTCHANNEL(rdch->format)));
 				if (tmp == 0)
 					tmp = rdch->format;
 				CHN_UNLOCK(rdch);
 			}
 			PCM_RELEASE_QUICK(d);
 			*arg_i = AFMT_ENCODING(tmp);
 		} else {
 			chn = wrch ? wrch : rdch;
 			CHN_LOCK(chn);
 			*arg_i = AFMT_ENCODING(chn->format);
 			CHN_UNLOCK(chn);
 		}
 		break;
 
     	case SNDCTL_DSP_SETFRAGMENT:
 		DEB(printf("SNDCTL_DSP_SETFRAGMENT 0x%08x\n", *(int *)arg));
 		{
 			uint32_t fragln = (*arg_i) & 0x0000ffff;
 			uint32_t maxfrags = ((*arg_i) & 0xffff0000) >> 16;
 			uint32_t fragsz;
 			uint32_t r_maxfrags, r_fragsz;
 
 			RANGE(fragln, 4, 16);
 			fragsz = 1 << fragln;
 
 			if (maxfrags == 0)
 				maxfrags = CHN_2NDBUFMAXSIZE / fragsz;
 			if (maxfrags < 2)
 				maxfrags = 2;
 			if (maxfrags * fragsz > CHN_2NDBUFMAXSIZE)
 				maxfrags = CHN_2NDBUFMAXSIZE / fragsz;
 
 			DEB(printf("SNDCTL_DSP_SETFRAGMENT %d frags, %d sz\n", maxfrags, fragsz));
 			PCM_ACQUIRE_QUICK(d);
 		    	if (rdch) {
 				CHN_LOCK(rdch);
 				ret = chn_setblocksize(rdch, maxfrags, fragsz);
 				r_maxfrags = sndbuf_getblkcnt(rdch->bufsoft);
 				r_fragsz = sndbuf_getblksz(rdch->bufsoft);
 				CHN_UNLOCK(rdch);
 			} else {
 				r_maxfrags = maxfrags;
 				r_fragsz = fragsz;
 			}
 		    	if (wrch && ret == 0) {
 				CHN_LOCK(wrch);
 				ret = chn_setblocksize(wrch, maxfrags, fragsz);
  				maxfrags = sndbuf_getblkcnt(wrch->bufsoft);
 				fragsz = sndbuf_getblksz(wrch->bufsoft);
 				CHN_UNLOCK(wrch);
 			} else { /* use whatever came from the read channel */
 				maxfrags = r_maxfrags;
 				fragsz = r_fragsz;
 			}
 			PCM_RELEASE_QUICK(d);
 
 			fragln = 0;
 			while (fragsz > 1) {
 				fragln++;
 				fragsz >>= 1;
 			}
 	    		*arg_i = (maxfrags << 16) | fragln;
 		}
 		break;
 
     	case SNDCTL_DSP_GETISPACE:
 		/* return the size of data available in the input queue */
 		{
 	    		audio_buf_info *a = (audio_buf_info *)arg;
 	    		if (rdch) {
 	        		struct snd_dbuf *bs = rdch->bufsoft;
 
 				CHN_LOCK(rdch);
 				a->bytes = sndbuf_getready(bs);
 	        		a->fragments = a->bytes / sndbuf_getblksz(bs);
 	        		a->fragstotal = sndbuf_getblkcnt(bs);
 	        		a->fragsize = sndbuf_getblksz(bs);
 				CHN_UNLOCK(rdch);
 	    		} else
 				ret = EINVAL;
 		}
 		break;
 
     	case SNDCTL_DSP_GETOSPACE:
 		/* return space available in the output queue */
 		{
 	    		audio_buf_info *a = (audio_buf_info *)arg;
 	    		if (wrch) {
 	        		struct snd_dbuf *bs = wrch->bufsoft;
 
 				CHN_LOCK(wrch);
 				/* XXX abusive DMA update: chn_wrupdate(wrch); */
 				a->bytes = sndbuf_getfree(bs);
 	        		a->fragments = a->bytes / sndbuf_getblksz(bs);
 	        		a->fragstotal = sndbuf_getblkcnt(bs);
 	        		a->fragsize = sndbuf_getblksz(bs);
 				CHN_UNLOCK(wrch);
 	    		} else
 				ret = EINVAL;
 		}
 		break;
 
     	case SNDCTL_DSP_GETIPTR:
 		{
 	    		count_info *a = (count_info *)arg;
 	    		if (rdch) {
 	        		struct snd_dbuf *bs = rdch->bufsoft;
 
 				CHN_LOCK(rdch);
 				/* XXX abusive DMA update: chn_rdupdate(rdch); */
 	        		a->bytes = sndbuf_gettotal(bs);
 	        		a->blocks = sndbuf_getblocks(bs) - rdch->blocks;
 	        		a->ptr = sndbuf_getfreeptr(bs);
 				rdch->blocks = sndbuf_getblocks(bs);
 				CHN_UNLOCK(rdch);
 	    		} else
 				ret = EINVAL;
 		}
 		break;
 
     	case SNDCTL_DSP_GETOPTR:
 		{
 	    		count_info *a = (count_info *)arg;
 	    		if (wrch) {
 	        		struct snd_dbuf *bs = wrch->bufsoft;
 
 				CHN_LOCK(wrch);
 				/* XXX abusive DMA update: chn_wrupdate(wrch); */
 	        		a->bytes = sndbuf_gettotal(bs);
 	        		a->blocks = sndbuf_getblocks(bs) - wrch->blocks;
 	        		a->ptr = sndbuf_getreadyptr(bs);
 				wrch->blocks = sndbuf_getblocks(bs);
 				CHN_UNLOCK(wrch);
 	    		} else
 				ret = EINVAL;
 		}
 		break;
 
     	case SNDCTL_DSP_GETCAPS:
 		PCM_LOCK(d);
 		*arg_i = PCM_CAP_REALTIME | PCM_CAP_MMAP | PCM_CAP_TRIGGER;
 		if (rdch && wrch && !(dsp_get_flags(i_dev) & SD_F_SIMPLEX))
 			*arg_i |= PCM_CAP_DUPLEX;
 		if (rdch && (rdch->flags & CHN_F_VIRTUAL) != 0)
 			*arg_i |= PCM_CAP_VIRTUAL;
 		if (wrch && (wrch->flags & CHN_F_VIRTUAL) != 0)
 			*arg_i |= PCM_CAP_VIRTUAL;
 		PCM_UNLOCK(d);
 		break;
 
     	case SOUND_PCM_READ_BITS:
 		chn = wrch ? wrch : rdch;
 		if (chn) {
 			CHN_LOCK(chn);
 			if (chn->format & AFMT_8BIT)
 				*arg_i = 8;
 			else if (chn->format & AFMT_16BIT)
 				*arg_i = 16;
 			else if (chn->format & AFMT_24BIT)
 				*arg_i = 24;
 			else if (chn->format & AFMT_32BIT)
 				*arg_i = 32;
 			else
 				ret = EINVAL;
 			CHN_UNLOCK(chn);
 		} else {
 			*arg_i = 0;
 			ret = EINVAL;
 		}
 		break;
 
     	case SNDCTL_DSP_SETTRIGGER:
 		if (rdch) {
 			CHN_LOCK(rdch);
 			rdch->flags &= ~CHN_F_NOTRIGGER;
 		    	if (*arg_i & PCM_ENABLE_INPUT)
 				chn_start(rdch, 1);
 			else {
 				chn_abort(rdch);
 				chn_resetbuf(rdch);
 				rdch->flags |= CHN_F_NOTRIGGER;
 			}
 			CHN_UNLOCK(rdch);
 		}
 		if (wrch) {
 			CHN_LOCK(wrch);
 			wrch->flags &= ~CHN_F_NOTRIGGER;
 		    	if (*arg_i & PCM_ENABLE_OUTPUT)
 				chn_start(wrch, 1);
 			else {
 				chn_abort(wrch);
 				chn_resetbuf(wrch);
 				wrch->flags |= CHN_F_NOTRIGGER;
 			}
 			CHN_UNLOCK(wrch);
 		}
 		break;
 
     	case SNDCTL_DSP_GETTRIGGER:
 		*arg_i = 0;
 		if (wrch) {
 			CHN_LOCK(wrch);
 			if (wrch->flags & CHN_F_TRIGGERED)
 				*arg_i |= PCM_ENABLE_OUTPUT;
 			CHN_UNLOCK(wrch);
 		}
 		if (rdch) {
 			CHN_LOCK(rdch);
 			if (rdch->flags & CHN_F_TRIGGERED)
 				*arg_i |= PCM_ENABLE_INPUT;
 			CHN_UNLOCK(rdch);
 		}
 		break;
 
 	case SNDCTL_DSP_GETODELAY:
 		if (wrch) {
 	        	struct snd_dbuf *bs = wrch->bufsoft;
 
 			CHN_LOCK(wrch);
 			/* XXX abusive DMA update: chn_wrupdate(wrch); */
 			*arg_i = sndbuf_getready(bs);
 			CHN_UNLOCK(wrch);
 		} else
 			ret = EINVAL;
 		break;
 
     	case SNDCTL_DSP_POST:
 		if (wrch) {
 			CHN_LOCK(wrch);
 			wrch->flags &= ~CHN_F_NOTRIGGER;
 			chn_start(wrch, 1);
 			CHN_UNLOCK(wrch);
 		}
 		break;
 
 	case SNDCTL_DSP_SETDUPLEX:
 		/*
 		 * switch to full-duplex mode if card is in half-duplex
 		 * mode and is able to work in full-duplex mode
 		 */
 		PCM_LOCK(d);
 		if (rdch && wrch && (dsp_get_flags(i_dev) & SD_F_SIMPLEX))
 			dsp_set_flags(i_dev, dsp_get_flags(i_dev)^SD_F_SIMPLEX);
 		PCM_UNLOCK(d);
 		break;
 
 	/*
 	 * The following four ioctls are simple wrappers around mixer_ioctl
 	 * with no further processing.  xcmd is short for "translated
 	 * command".
 	 */
 	case SNDCTL_DSP_GETRECVOL:
 		if (xcmd == 0) {
 			xcmd = SOUND_MIXER_READ_RECLEV;
 			chn = rdch;
 		}
 		/* FALLTHROUGH */
 	case SNDCTL_DSP_SETRECVOL:
 		if (xcmd == 0) {
 			xcmd = SOUND_MIXER_WRITE_RECLEV;
 			chn = rdch;
 		}
 		/* FALLTHROUGH */
 	case SNDCTL_DSP_GETPLAYVOL:
 		if (xcmd == 0) {
 			xcmd = SOUND_MIXER_READ_PCM;
 			chn = wrch;
 		}
 		/* FALLTHROUGH */
 	case SNDCTL_DSP_SETPLAYVOL:
 		if (xcmd == 0) {
 			xcmd = SOUND_MIXER_WRITE_PCM;
 			chn = wrch;
 		}
 
-		ret = dsp_ioctl_channel(i_dev, chn, xcmd, arg);
+		ret = dsp_ioctl_channel(priv, chn, xcmd, arg);
 		if (ret != -1) {
 			PCM_GIANT_EXIT(d);
 			return (ret);
 		}
 
 		if (d->mixer_dev != NULL) {
 			PCM_ACQUIRE_QUICK(d);
 			ret = mixer_ioctl_cmd(d->mixer_dev, xcmd, arg, -1, td,
 			    MIXER_CMD_DIRECT);
 			PCM_RELEASE_QUICK(d);
 		} else
 			ret = ENOTSUP;
 
 		break;
 
 	case SNDCTL_DSP_GET_RECSRC_NAMES:
 	case SNDCTL_DSP_GET_RECSRC:
 	case SNDCTL_DSP_SET_RECSRC:
 		if (d->mixer_dev != NULL) {
 			PCM_ACQUIRE_QUICK(d);
 			ret = mixer_ioctl_cmd(d->mixer_dev, cmd, arg, -1, td,
 			    MIXER_CMD_DIRECT);
 			PCM_RELEASE_QUICK(d);
 		} else
 			ret = ENOTSUP;
 		break;
 
 	/*
 	 * The following 3 ioctls aren't very useful at the moment.  For
 	 * now, only a single channel is associated with a cdev (/dev/dspN
 	 * instance), so there's only a single output routing to use (i.e.,
 	 * the wrch bound to this cdev).
 	 */
 	case SNDCTL_DSP_GET_PLAYTGT_NAMES:
 		{
 			oss_mixer_enuminfo *ei;
 			ei = (oss_mixer_enuminfo *)arg;
 			ei->dev = 0;
 			ei->ctrl = 0;
 			ei->version = 0; /* static for now */
 			ei->strindex[0] = 0;
 
 			if (wrch != NULL) {
 				ei->nvalues = 1;
 				strlcpy(ei->strings, wrch->name,
 					sizeof(ei->strings));
 			} else {
 				ei->nvalues = 0;
 				ei->strings[0] = '\0';
 			}
 		}
 		break;
 	case SNDCTL_DSP_GET_PLAYTGT:
 	case SNDCTL_DSP_SET_PLAYTGT:	/* yes, they are the same for now */
 		/*
 		 * Re: SET_PLAYTGT
 		 *   OSSv4: "The value that was accepted by the device will
 		 *   be returned back in the variable pointed by the
 		 *   argument."
 		 */
 		if (wrch != NULL)
 			*arg_i = 0;
 		else
 			ret = EINVAL;
 		break;
 
 	case SNDCTL_DSP_SILENCE:
 	/*
 	 * Flush the software (pre-feed) buffer, but try to minimize playback
 	 * interruption.  (I.e., record unplayed samples with intent to
 	 * restore by SNDCTL_DSP_SKIP.) Intended for application "pause"
 	 * functionality.
 	 */
 		if (wrch == NULL)
 			ret = EINVAL;
 		else {
 			struct snd_dbuf *bs;
 			CHN_LOCK(wrch);
 			while (wrch->inprog != 0)
 				cv_wait(&wrch->cv, wrch->lock);
 			bs = wrch->bufsoft;
 			if ((bs->shadbuf != NULL) && (sndbuf_getready(bs) > 0)) {
 				bs->sl = sndbuf_getready(bs);
 				sndbuf_dispose(bs, bs->shadbuf, sndbuf_getready(bs));
 				sndbuf_fillsilence(bs);
 				chn_start(wrch, 0);
 			}
 			CHN_UNLOCK(wrch);
 		}
 		break;
 
 	case SNDCTL_DSP_SKIP:
 	/*
 	 * OSSv4 docs: "This ioctl call discards all unplayed samples in the
 	 * playback buffer by moving the current write position immediately
 	 * before the point where the device is currently reading the samples."
 	 */
 		if (wrch == NULL)
 			ret = EINVAL;
 		else {
 			struct snd_dbuf *bs;
 			CHN_LOCK(wrch);
 			while (wrch->inprog != 0)
 				cv_wait(&wrch->cv, wrch->lock);
 			bs = wrch->bufsoft;
 			if ((bs->shadbuf != NULL) && (bs->sl > 0)) {
 				sndbuf_softreset(bs);
 				sndbuf_acquire(bs, bs->shadbuf, bs->sl);
 				bs->sl = 0;
 				chn_start(wrch, 0);
 			}
 			CHN_UNLOCK(wrch);
 		}
 		break;
 
 	case SNDCTL_DSP_CURRENT_OPTR:
 	case SNDCTL_DSP_CURRENT_IPTR:
 	/**
 	 * @note Changing formats resets the buffer counters, which differs
 	 * 	 from the 4Front drivers.  However, I don't expect this to be
 	 * 	 much of a problem.
 	 *
 	 * @note In a test where @c CURRENT_OPTR is called immediately after write
 	 * 	 returns, this driver is about 32K samples behind whereas
 	 * 	 4Front's is about 8K samples behind.  Should determine source
 	 * 	 of discrepancy, even if only out of curiosity.
 	 *
 	 * @todo Actually test SNDCTL_DSP_CURRENT_IPTR.
 	 */
 		chn = (cmd == SNDCTL_DSP_CURRENT_OPTR) ? wrch : rdch;
 		if (chn == NULL) 
 			ret = EINVAL;
 		else {
 			struct snd_dbuf *bs;
 			/* int tmp; */
 
 			oss_count_t *oc = (oss_count_t *)arg;
 
 			CHN_LOCK(chn);
 			bs = chn->bufsoft;
 #if 0
 			tmp = (sndbuf_getsize(b) + chn_getptr(chn) - sndbuf_gethwptr(b)) % sndbuf_getsize(b);
 			oc->samples = (sndbuf_gettotal(b) + tmp) / sndbuf_getalign(b);
 			oc->fifo_samples = (sndbuf_getready(b) - tmp) / sndbuf_getalign(b);
 #else
 			oc->samples = sndbuf_gettotal(bs) / sndbuf_getalign(bs);
 			oc->fifo_samples = sndbuf_getready(bs) / sndbuf_getalign(bs);
 #endif
 			CHN_UNLOCK(chn);
 		}
 		break;
 
 	case SNDCTL_DSP_HALT_OUTPUT:
 	case SNDCTL_DSP_HALT_INPUT:
 		chn = (cmd == SNDCTL_DSP_HALT_OUTPUT) ? wrch : rdch;
 		if (chn == NULL)
 			ret = EINVAL;
 		else {
 			CHN_LOCK(chn);
 			chn_abort(chn);
 			CHN_UNLOCK(chn);
 		}
 		break;
 
 	case SNDCTL_DSP_LOW_WATER:
 	/*
 	 * Set the number of bytes required to attract attention by
 	 * select/poll.
 	 */
 		if (wrch != NULL) {
 			CHN_LOCK(wrch);
 			wrch->lw = (*arg_i > 1) ? *arg_i : 1;
 			CHN_UNLOCK(wrch);
 		}
 		if (rdch != NULL) {
 			CHN_LOCK(rdch);
 			rdch->lw = (*arg_i > 1) ? *arg_i : 1;
 			CHN_UNLOCK(rdch);
 		}
 		break;
 
 	case SNDCTL_DSP_GETERROR:
 	/*
 	 * OSSv4 docs:  "All errors and counters will automatically be
 	 * cleared to zeroes after the call so each call will return only
 	 * the errors that occurred after the previous invocation. ... The
 	 * play_underruns and rec_overrun fields are the only useful fields
 	 * returned by OSS 4.0."
 	 */
 		{
 			audio_errinfo *ei = (audio_errinfo *)arg;
 
 			bzero((void *)ei, sizeof(*ei));
 
 			if (wrch != NULL) {
 				CHN_LOCK(wrch);
 				ei->play_underruns = wrch->xruns;
 				wrch->xruns = 0;
 				CHN_UNLOCK(wrch);
 			}
 			if (rdch != NULL) {
 				CHN_LOCK(rdch);
 				ei->rec_overruns = rdch->xruns;
 				rdch->xruns = 0;
 				CHN_UNLOCK(rdch);
 			}
 		}
 		break;
 
 	case SNDCTL_DSP_SYNCGROUP:
 		PCM_ACQUIRE_QUICK(d);
 		ret = dsp_oss_syncgroup(wrch, rdch, (oss_syncgroup *)arg);
 		PCM_RELEASE_QUICK(d);
 		break;
 
 	case SNDCTL_DSP_SYNCSTART:
 		PCM_ACQUIRE_QUICK(d);
 		ret = dsp_oss_syncstart(*arg_i);
 		PCM_RELEASE_QUICK(d);
 		break;
 
 	case SNDCTL_DSP_POLICY:
 		PCM_ACQUIRE_QUICK(d);
 		ret = dsp_oss_policy(wrch, rdch, *arg_i);
 		PCM_RELEASE_QUICK(d);
 		break;
 
 	case SNDCTL_DSP_COOKEDMODE:
 		PCM_ACQUIRE_QUICK(d);
 		if (!(dsp_get_flags(i_dev) & SD_F_BITPERFECT))
 			ret = dsp_oss_cookedmode(wrch, rdch, *arg_i);
 		PCM_RELEASE_QUICK(d);
 		break;
 	case SNDCTL_DSP_GET_CHNORDER:
 		PCM_ACQUIRE_QUICK(d);
 		ret = dsp_oss_getchnorder(wrch, rdch, (unsigned long long *)arg);
 		PCM_RELEASE_QUICK(d);
 		break;
 	case SNDCTL_DSP_SET_CHNORDER:
 		PCM_ACQUIRE_QUICK(d);
 		ret = dsp_oss_setchnorder(wrch, rdch, (unsigned long long *)arg);
 		PCM_RELEASE_QUICK(d);
 		break;
 	case SNDCTL_DSP_GETCHANNELMASK:		/* XXX vlc */
 		PCM_ACQUIRE_QUICK(d);
 		ret = dsp_oss_getchannelmask(wrch, rdch, (int *)arg);
 		PCM_RELEASE_QUICK(d);
 		break;
 	case SNDCTL_DSP_BIND_CHANNEL:		/* XXX what?!? */
 		ret = EINVAL;
 		break;
 #ifdef	OSSV4_EXPERIMENT
 	/*
 	 * XXX The following ioctls are not yet supported and just return
 	 * EINVAL.
 	 */
 	case SNDCTL_DSP_GETOPEAKS:
 	case SNDCTL_DSP_GETIPEAKS:
 		chn = (cmd == SNDCTL_DSP_GETOPEAKS) ? wrch : rdch;
 		if (chn == NULL)
 			ret = EINVAL;
 		else {
 			oss_peaks_t *op = (oss_peaks_t *)arg;
 			int lpeak, rpeak;
 
 			CHN_LOCK(chn);
 			ret = chn_getpeaks(chn, &lpeak, &rpeak);
 			if (ret == -1)
 				ret = EINVAL;
 			else {
 				(*op)[0] = lpeak;
 				(*op)[1] = rpeak;
 			}
 			CHN_UNLOCK(chn);
 		}
 		break;
 
 	/*
 	 * XXX Once implemented, revisit this for proper cv protection
 	 *     (if necessary).
 	 */
 	case SNDCTL_GETLABEL:
 		ret = dsp_oss_getlabel(wrch, rdch, (oss_label_t *)arg);
 		break;
 	case SNDCTL_SETLABEL:
 		ret = dsp_oss_setlabel(wrch, rdch, (oss_label_t *)arg);
 		break;
 	case SNDCTL_GETSONG:
 		ret = dsp_oss_getsong(wrch, rdch, (oss_longname_t *)arg);
 		break;
 	case SNDCTL_SETSONG:
 		ret = dsp_oss_setsong(wrch, rdch, (oss_longname_t *)arg);
 		break;
 	case SNDCTL_SETNAME:
 		ret = dsp_oss_setname(wrch, rdch, (oss_longname_t *)arg);
 		break;
 #if 0
 	/**
 	 * @note The S/PDIF interface ioctls, @c SNDCTL_DSP_READCTL and
 	 * @c SNDCTL_DSP_WRITECTL have been omitted at the suggestion of
 	 * 4Front Technologies.
 	 */
 	case SNDCTL_DSP_READCTL:
 	case SNDCTL_DSP_WRITECTL:
 		ret = EINVAL;
 		break;
 #endif	/* !0 (explicitly omitted ioctls) */
 
 #endif	/* !OSSV4_EXPERIMENT */
     	case SNDCTL_DSP_MAPINBUF:
     	case SNDCTL_DSP_MAPOUTBUF:
     	case SNDCTL_DSP_SETSYNCRO:
 		/* undocumented */
 
     	case SNDCTL_DSP_SUBDIVIDE:
     	case SOUND_PCM_WRITE_FILTER:
     	case SOUND_PCM_READ_FILTER:
 		/* dunno what these do, don't sound important */
 
     	default:
 		DEB(printf("default ioctl fn 0x%08lx fail\n", cmd));
 		ret = EINVAL;
 		break;
     	}
 
 	PCM_GIANT_LEAVE(d);
 
     	return (ret);
 }
 
 static int
 dsp_poll(struct cdev *i_dev, int events, struct thread *td)
 {
+	struct dsp_cdevpriv *priv;
 	struct snddev_info *d;
 	struct pcm_channel *wrch, *rdch;
-	int ret, e;
+	int ret, e, err;
 
-	d = dsp_get_info(i_dev);
-	if (PCM_DETACHING(d) || !DSP_REGISTERED(d, i_dev)) {
+	if ((err = devfs_get_cdevpriv((void **)&priv)) != 0)
+		return (err);
+	d = priv->sc;
+	if (PCM_DETACHING(d) || !DSP_REGISTERED(d)) {
 		/* XXX many clients don't understand POLLNVAL */
 		return (events & (POLLHUP | POLLPRI | POLLIN |
 		    POLLRDNORM | POLLOUT | POLLWRNORM));
 	}
 	PCM_GIANT_ENTER(d);
 
-	wrch = NULL;
-	rdch = NULL;
 	ret = 0;
 
-	getchns(i_dev, &rdch, &wrch, SD_F_PRIO_RD | SD_F_PRIO_WR);
+	getchns(priv, SD_F_PRIO_RD | SD_F_PRIO_WR);
+	wrch = priv->wrch;
+	rdch = priv->rdch;
 
 	if (wrch != NULL && !(wrch->flags & CHN_F_DEAD)) {
 		e = (events & (POLLOUT | POLLWRNORM));
 		if (e)
 			ret |= chn_poll(wrch, e, td);
 	}
 
 	if (rdch != NULL && !(rdch->flags & CHN_F_DEAD)) {
 		e = (events & (POLLIN | POLLRDNORM));
 		if (e)
 			ret |= chn_poll(rdch, e, td);
 	}
 
-	relchns(i_dev, rdch, wrch, SD_F_PRIO_RD | SD_F_PRIO_WR);
+	relchns(priv, SD_F_PRIO_RD | SD_F_PRIO_WR);
 
 	PCM_GIANT_LEAVE(d);
 
 	return (ret);
 }
 
 static int
 dsp_mmap(struct cdev *i_dev, vm_ooffset_t offset, vm_paddr_t *paddr,
     int nprot, vm_memattr_t *memattr)
 {
 
 	/*
 	 * offset is in range due to checks in dsp_mmap_single().
 	 * XXX memattr is not honored.
 	 */
 	*paddr = vtophys(offset);
 	return (0);
 }
 
 static int
 dsp_mmap_single(struct cdev *i_dev, vm_ooffset_t *offset,
     vm_size_t size, struct vm_object **object, int nprot)
 {
+	struct dsp_cdevpriv *priv;
 	struct snddev_info *d;
 	struct pcm_channel *wrch, *rdch, *c;
+	int err;
 
 	/*
 	 * Reject PROT_EXEC by default. It just doesn't makes sense.
 	 * Unfortunately, we have to give up this one due to linux_mmap
 	 * changes.
 	 *
 	 * https://lists.freebsd.org/pipermail/freebsd-emulation/2007-June/003698.html
 	 *
 	 */
 #ifdef SV_ABI_LINUX
 	if ((nprot & PROT_EXEC) && (dsp_mmap_allow_prot_exec < 0 ||
 	    (dsp_mmap_allow_prot_exec == 0 &&
 	    SV_CURPROC_ABI() != SV_ABI_LINUX)))
 #else
 	if ((nprot & PROT_EXEC) && dsp_mmap_allow_prot_exec < 1)
 #endif
 		return (EINVAL);
 
 	/*
 	 * PROT_READ (alone) selects the input buffer.
 	 * PROT_WRITE (alone) selects the output buffer.
 	 * PROT_WRITE|PROT_READ together select the output buffer.
 	 */
 	if ((nprot & (PROT_READ | PROT_WRITE)) == 0)
 		return (EINVAL);
 
-	d = dsp_get_info(i_dev);
-	if (PCM_DETACHING(d) || !DSP_REGISTERED(d, i_dev))
+	if ((err = devfs_get_cdevpriv((void **)&priv)) != 0)
+		return (err);
+	d = priv->sc;
+	if (PCM_DETACHING(d) || !DSP_REGISTERED(d))
 		return (EINVAL);
 
 	PCM_GIANT_ENTER(d);
 
-	getchns(i_dev, &rdch, &wrch, SD_F_PRIO_RD | SD_F_PRIO_WR);
+	getchns(priv, SD_F_PRIO_RD | SD_F_PRIO_WR);
+	wrch = priv->wrch;
+	rdch = priv->rdch;
 
 	c = ((nprot & PROT_WRITE) != 0) ? wrch : rdch;
 	if (c == NULL || (c->flags & CHN_F_MMAP_INVALID) ||
 	    (*offset  + size) > sndbuf_getallocsize(c->bufsoft) ||
 	    (wrch != NULL && (wrch->flags & CHN_F_MMAP_INVALID)) ||
 	    (rdch != NULL && (rdch->flags & CHN_F_MMAP_INVALID))) {
-		relchns(i_dev, rdch, wrch, SD_F_PRIO_RD | SD_F_PRIO_WR);
+		relchns(priv, SD_F_PRIO_RD | SD_F_PRIO_WR);
 		PCM_GIANT_EXIT(d);
 		return (EINVAL);
 	}
 
 	if (wrch != NULL)
 		wrch->flags |= CHN_F_MMAP;
 	if (rdch != NULL)
 		rdch->flags |= CHN_F_MMAP;
 
 	*offset = (uintptr_t)sndbuf_getbufofs(c->bufsoft, *offset);
-	relchns(i_dev, rdch, wrch, SD_F_PRIO_RD | SD_F_PRIO_WR);
+	relchns(priv, SD_F_PRIO_RD | SD_F_PRIO_WR);
 	*object = vm_pager_allocate(OBJT_DEVICE, i_dev,
 	    size, nprot, *offset, curthread->td_ucred);
 
 	PCM_GIANT_LEAVE(d);
 
 	if (*object == NULL)
 		 return (EINVAL);
 	return (0);
 }
 
-/* So much for dev_stdclone() */
-static int
-dsp_stdclone(char *name, char *namep, char *sep, int use_sep, int *u, int *c)
-{
-	size_t len;
-
-	len = strlen(namep);
-	if (strncmp(name, namep, len) != 0)
-		return (ENODEV);
-
-	name += len;
-
-	if (isdigit(*name) == 0)
-		return (ENODEV);
-
-	len = strlen(sep);
-
-	if (*name == '0' && !(name[1] == '\0' || bcmp(name + 1, sep, len) == 0))
-		return (ENODEV);
-
-	for (*u = 0; isdigit(*name) != 0; name++) {
-		*u *= 10;
-		*u += *name - '0';
-		if (*u > dsp_umax)
-			return (ENODEV);
-	}
-
-	if (*name == '\0')
-		return ((use_sep == 0) ? 0 : ENODEV);
-
-	if (bcmp(name, sep, len) != 0 || isdigit(name[len]) == 0)
-		return (ENODEV);
-
-	name += len;
-
-	if (*name == '0' && name[1] != '\0')
-		return (ENODEV);
-
-	for (*c = 0; isdigit(*name) != 0; name++) {
-		*c *= 10;
-		*c += *name - '0';
-		if (*c > dsp_cmax)
-			return (ENODEV);
-	}
-
-	if (*name != '\0')
-		return (ENODEV);
-
-	return (0);
-}
-
 static void
-dsp_clone(void *arg,
-    struct ucred *cred,
-    char *name, int namelen, struct cdev **dev)
+dsp_clone(void *arg, struct ucred *cred, char *name, int namelen,
+    struct cdev **dev)
 {
 	struct snddev_info *d;
-	struct snd_clone_entry *ce;
-	struct pcm_channel *c;
-	int i, unit, udcmask, cunit, devtype, devhw, devcmax, tumax;
-	char *devname, *devcmp, *devsep;
-
-	KASSERT(dsp_umax >= 0 && dsp_cmax >= 0, ("Uninitialized unit!"));
+	int i;
 
 	if (*dev != NULL)
 		return;
-
-	unit = -1;
-	cunit = -1;
-	devtype = -1;
-	devhw = 0;
-	devcmax = -1;
-	tumax = -1;
-	devname = NULL;
-	devsep = NULL;
-
-	for (i = 0; unit == -1 &&
-	    i < (sizeof(dsp_cdevs) / sizeof(dsp_cdevs[0])); i++) {
-		devtype = dsp_cdevs[i].type;
-		devcmp = dsp_cdevs[i].name;
-		devsep = dsp_cdevs[i].sep;
-		devname = dsp_cdevs[i].alias;
-		if (devname == NULL)
-			devname = devcmp;
-		devhw = dsp_cdevs[i].hw;
-		devcmax = dsp_cdevs[i].max - 1;
-		if (strcmp(name, devcmp) == 0) {
-			if (dsp_basename_clone != 0)
-				unit = snd_unit;
-		} else if (dsp_stdclone(name, devcmp, devsep,
-		    dsp_cdevs[i].use_sep, &unit, &cunit) != 0) {
-			unit = -1;
-			cunit = -1;
-		}
+	if (strcmp(name, "dsp") == 0 && dsp_basename_clone)
+		goto found;
+	for (i = 0; i < nitems(dsp_cdevs); i++) {
+		if (dsp_cdevs[i].alias != NULL &&
+		    strcmp(name, dsp_cdevs[i].name) == 0)
+			goto found;
 	}
-
-	d = devclass_get_softc(pcm_devclass, unit);
-	if (!PCM_REGISTERED(d) || d->clones == NULL)
+	return;
+found:
+	d = devclass_get_softc(pcm_devclass, snd_unit);
+	if (!PCM_REGISTERED(d))
 		return;
-
-	/* XXX Need Giant magic entry ??? */
-
-	PCM_LOCK(d);
-	if (snd_clone_disabled(d->clones)) {
-		PCM_UNLOCK(d);
-		return;
-	}
-
-	PCM_WAIT(d);
-	PCM_ACQUIRE(d);
-	PCM_UNLOCK(d);
-
-	udcmask = snd_u2unit(unit) | snd_d2unit(devtype);
-
-	if (devhw != 0) {
-		KASSERT(devcmax <= dsp_cmax,
-		    ("overflow: devcmax=%d, dsp_cmax=%d", devcmax, dsp_cmax));
-		if (cunit > devcmax) {
-			PCM_RELEASE_QUICK(d);
-			return;
-		}
-		udcmask |= snd_c2unit(cunit);
-		CHN_FOREACH(c, d, channels.pcm) {
-			CHN_LOCK(c);
-			if (c->unit != udcmask) {
-				CHN_UNLOCK(c);
-				continue;
-			}
-			CHN_UNLOCK(c);
-			udcmask &= ~snd_c2unit(cunit);
-			/*
-			 * Temporarily increase clone maxunit to overcome
-			 * vchan flexibility.
-			 *
-			 * # sysctl dev.pcm.0.play.vchans=256
-			 * dev.pcm.0.play.vchans: 1 -> 256
-			 * # cat /dev/zero > /dev/dsp0.vp255 &
-			 * [1] 17296
-			 * # sysctl dev.pcm.0.play.vchans=0
-			 * dev.pcm.0.play.vchans: 256 -> 1
-			 * # fg
-			 * [1]  + running    cat /dev/zero > /dev/dsp0.vp255
-			 * ^C
-			 * # cat /dev/zero > /dev/dsp0.vp255
-			 * zsh: operation not supported: /dev/dsp0.vp255
-			 */
-			tumax = snd_clone_getmaxunit(d->clones);
-			if (cunit > tumax)
-				snd_clone_setmaxunit(d->clones, cunit);
-			else
-				tumax = -1;
-			goto dsp_clone_alloc;
-		}
-		/*
-		 * Ok, so we're requesting unallocated vchan, but still
-		 * within maximum vchan limit.
-		 */
-		if (((devtype == SND_DEV_DSPHW_VPLAY && d->pvchancount > 0) ||
-		    (devtype == SND_DEV_DSPHW_VREC && d->rvchancount > 0)) &&
-		    cunit < snd_maxautovchans) {
-			udcmask &= ~snd_c2unit(cunit);
-			tumax = snd_clone_getmaxunit(d->clones);
-			if (cunit > tumax)
-				snd_clone_setmaxunit(d->clones, cunit);
-			else
-				tumax = -1;
-			goto dsp_clone_alloc;
-		}
-		PCM_RELEASE_QUICK(d);
-		return;
-	}
-
-dsp_clone_alloc:
-	ce = snd_clone_alloc(d->clones, dev, &cunit, udcmask);
-	if (tumax != -1)
-		snd_clone_setmaxunit(d->clones, tumax);
-	if (ce != NULL) {
-		udcmask |= snd_c2unit(cunit);
-		*dev = make_dev(&dsp_cdevsw, PCMMINOR(udcmask),
-		    UID_ROOT, GID_WHEEL, 0666, "%s%d%s%d",
-		    devname, unit, devsep, cunit);
-		snd_clone_register(ce, *dev);
-	}
-
-	PCM_RELEASE_QUICK(d);
-
-	if (*dev != NULL)
-		dev_ref(*dev);
+	*dev = d->dsp_dev;
+	dev_ref(*dev);
 }
 
 static void
 dsp_sysinit(void *p)
 {
 	if (dsp_ehtag != NULL)
 		return;
 	/* initialize unit numbering */
 	snd_unit_init();
-	dsp_umax = PCMMAXUNIT;
-	dsp_cmax = PCMMAXCHAN;
 	dsp_ehtag = EVENTHANDLER_REGISTER(dev_clone, dsp_clone, 0, 1000);
 }
 
 static void
 dsp_sysuninit(void *p)
 {
 	if (dsp_ehtag == NULL)
 		return;
 	EVENTHANDLER_DEREGISTER(dev_clone, dsp_ehtag);
 	dsp_ehtag = NULL;
 }
 
 SYSINIT(dsp_sysinit, SI_SUB_DRIVERS, SI_ORDER_MIDDLE, dsp_sysinit, NULL);
 SYSUNINIT(dsp_sysuninit, SI_SUB_DRIVERS, SI_ORDER_MIDDLE, dsp_sysuninit, NULL);
 
 char *
 dsp_unit2name(char *buf, size_t len, int unit)
 {
 	int i, dtype;
 
 	KASSERT(buf != NULL && len != 0,
 	    ("bogus buf=%p len=%ju", buf, (uintmax_t)len));
 
 	dtype = snd_unit2d(unit);
 
-	for (i = 0; i < (sizeof(dsp_cdevs) / sizeof(dsp_cdevs[0])); i++) {
+	for (i = 0; i < nitems(dsp_cdevs); i++) {
 		if (dtype != dsp_cdevs[i].type || dsp_cdevs[i].alias != NULL)
 			continue;
 		snprintf(buf, len, "%s%d%s%d", dsp_cdevs[i].name,
 		    snd_unit2u(unit), dsp_cdevs[i].sep, snd_unit2c(unit));
 		return (buf);
 	}
 
 	return (NULL);
 }
 
+static int
+dsp_oss_audioinfo_cb(void *data, void *arg)
+{
+	struct dsp_cdevpriv *priv = data;
+	struct pcm_channel *ch = arg;
+
+	if (DSP_REGISTERED(priv->sc) && (ch == priv->rdch || ch == priv->wrch))
+		return (1);
+
+	return (0);
+}
+
 /**
  * @brief Handler for SNDCTL_AUDIOINFO.
  *
  * Gathers information about the audio device specified in ai->dev.  If
  * ai->dev == -1, then this function gathers information about the current
  * device.  If the call comes in on a non-audio device and ai->dev == -1,
  * return EINVAL.
  *
  * This routine is supposed to go practically straight to the hardware,
  * getting capabilities directly from the sound card driver, side-stepping
  * the intermediate channel interface.
  *
- * Note, however, that the usefulness of this command is significantly
- * decreased when requesting info about any device other than the one serving
- * the request. While each snddev_channel refers to a specific device node,
- * the converse is *not* true.  Currently, when a sound device node is opened,
- * the sound subsystem scans for an available audio channel (or channels, if
- * opened in read+write) and then assigns them to the si_drv[12] private
- * data fields.  As a result, any information returned linking a channel to
- * a specific character device isn't necessarily accurate.
- *
  * @note
  * Calling threads must not hold any snddev_info or pcm_channel locks.
  * 
  * @param dev		device on which the ioctl was issued
  * @param ai		ioctl request data container
  *
  * @retval 0		success
  * @retval EINVAL	ai->dev specifies an invalid device
  *
  * @todo Verify correctness of Doxygen tags.  ;)
  */
 int
 dsp_oss_audioinfo(struct cdev *i_dev, oss_audioinfo *ai)
 {
 	struct pcmchan_caps *caps;
 	struct pcm_channel *ch;
 	struct snddev_info *d;
 	uint32_t fmts;
 	int i, nchan, *rates, minch, maxch;
 	char *devname, buf[CHN_NAMELEN];
 
 	/*
 	 * If probing the device that received the ioctl, make sure it's a
 	 * DSP device.  (Users may use this ioctl with /dev/mixer and
 	 * /dev/midi.)
 	 */
 	if (ai->dev == -1 && i_dev->si_devsw != &dsp_cdevsw)
 		return (EINVAL);
 
 	ch = NULL;
 	devname = NULL;
 	nchan = 0;
 	bzero(buf, sizeof(buf));
 
 	/*
 	 * Search for the requested audio device (channel).  Start by
 	 * iterating over pcm devices.
 	 */ 
 	for (i = 0; pcm_devclass != NULL &&
 	    i < devclass_get_maxunit(pcm_devclass); i++) {
 		d = devclass_get_softc(pcm_devclass, i);
 		if (!PCM_REGISTERED(d))
 			continue;
 
 		/* XXX Need Giant magic entry ??? */
 
 		/* See the note in function docblock */
 		PCM_UNLOCKASSERT(d);
 		PCM_LOCK(d);
 
 		CHN_FOREACH(ch, d, channels.pcm) {
 			CHN_UNLOCKASSERT(ch);
 			CHN_LOCK(ch);
 			if (ai->dev == -1) {
-				if (DSP_REGISTERED(d, i_dev) &&
-				    (ch == PCM_RDCH(i_dev) ||	/* record ch */
-				    ch == PCM_WRCH(i_dev))) {	/* playback ch */
+				if (devfs_foreach_cdevpriv(i_dev,
+				    dsp_oss_audioinfo_cb, ch) != 0) {
 					devname = dsp_unit2name(buf,
 					    sizeof(buf), ch->unit);
 				}
 			} else if (ai->dev == nchan) {
 				devname = dsp_unit2name(buf, sizeof(buf),
 				    ch->unit);
 			}
 			if (devname != NULL)
 				break;
 			CHN_UNLOCK(ch);
 			++nchan;
 		}
 
 		if (devname != NULL) {
 			/*
 			 * At this point, the following synchronization stuff
 			 * has happened:
 			 * - a specific PCM device is locked.
 			 * - a specific audio channel has been locked, so be
 			 *   sure to unlock when exiting;
 			 */
 
 			caps = chn_getcaps(ch);
 
 			/*
 			 * With all handles collected, zero out the user's
 			 * container and begin filling in its fields.
 			 */
 			bzero((void *)ai, sizeof(oss_audioinfo));
 
 			ai->dev = nchan;
 			strlcpy(ai->name, ch->name,  sizeof(ai->name));
 
 			if ((ch->flags & CHN_F_BUSY) == 0)
 				ai->busy = 0;
 			else
 				ai->busy = (ch->direction == PCMDIR_PLAY) ? OPEN_WRITE : OPEN_READ;
 
 			/**
 			 * @note
 			 * @c cmd - OSSv4 docs: "Only supported under Linux at
 			 *    this moment." Cop-out, I know, but I'll save
 			 *    running around in the process table for later.
 			 *    Is there a risk of leaking information?
 			 */
 			ai->pid = ch->pid;
 
 			/*
 			 * These flags stolen from SNDCTL_DSP_GETCAPS handler.
 			 * Note, however, that a single channel operates in
 			 * only one direction, so PCM_CAP_DUPLEX is out.
 			 */
 			/**
 			 * @todo @c SNDCTL_AUDIOINFO::caps - Make drivers keep
 			 *       these in pcmchan::caps?
 			 */
 			ai->caps = PCM_CAP_REALTIME | PCM_CAP_MMAP | PCM_CAP_TRIGGER |
 			    ((ch->flags & CHN_F_VIRTUAL) ? PCM_CAP_VIRTUAL : 0) |
 			    ((ch->direction == PCMDIR_PLAY) ? PCM_CAP_OUTPUT : PCM_CAP_INPUT);
 
 			/*
 			 * Collect formats supported @b natively by the
 			 * device.  Also determine min/max channels.  (I.e.,
 			 * mono, stereo, or both?)
 			 *
 			 * If any channel is stereo, maxch = 2;
 			 * if all channels are stereo, minch = 2, too;
 			 * if any channel is mono, minch = 1;
 			 * and if all channels are mono, maxch = 1.
 			 */
 			minch = 0;
 			maxch = 0;
 			fmts = 0;
 			for (i = 0; caps->fmtlist[i]; i++) {
 				fmts |= caps->fmtlist[i];
 				if (AFMT_CHANNEL(caps->fmtlist[i]) > 1) {
 					minch = (minch == 0) ? 2 : minch;
 					maxch = 2;
 				} else {
 					minch = 1;
 					maxch = (maxch == 0) ? 1 : maxch;
 				}
 			}
 
 			if (ch->direction == PCMDIR_PLAY)
 				ai->oformats = fmts;
 			else
 				ai->iformats = fmts;
 
 			/**
 			 * @note
 			 * @c magic - OSSv4 docs: "Reserved for internal use
 			 *    by OSS."
 			 *
 			 * @par
 			 * @c card_number - OSSv4 docs: "Number of the sound
 			 *    card where this device belongs or -1 if this
 			 *    information is not available.  Applications
 			 *    should normally not use this field for any
 			 *    purpose."
 			 */
 			ai->card_number = -1;
 			/**
 			 * @todo @c song_name - depends first on
 			 *          SNDCTL_[GS]ETSONG @todo @c label - depends
 			 *          on SNDCTL_[GS]ETLABEL
 			 * @todo @c port_number - routing information?
 			 */
 			ai->port_number = -1;
 			ai->mixer_dev = (d->mixer_dev != NULL) ? PCMUNIT(d->mixer_dev) : -1;
 			/**
 			 * @note
 			 * @c real_device - OSSv4 docs:  "Obsolete."
 			 */
 			ai->real_device = -1;
-			strlcpy(ai->devnode, "/dev/", sizeof(ai->devnode));
-			strlcat(ai->devnode, devname, sizeof(ai->devnode));
+			snprintf(ai->devnode, sizeof(ai->devnode),
+			    "/dev/dsp%d", device_get_unit(d->dev));
 			ai->enabled = device_is_attached(d->dev) ? 1 : 0;
 			/**
 			 * @note
 			 * @c flags - OSSv4 docs: "Reserved for future use."
 			 *
 			 * @note
 			 * @c binding - OSSv4 docs: "Reserved for future use."
 			 *
 			 * @todo @c handle - haven't decided how to generate
 			 *       this yet; bus, vendor, device IDs?
 			 */
 			ai->min_rate = caps->minspeed;
 			ai->max_rate = caps->maxspeed;
 
 			ai->min_channels = minch;
 			ai->max_channels = maxch;
 
 			ai->nrates = chn_getrates(ch, &rates);
 			if (ai->nrates > OSS_MAX_SAMPLE_RATES)
 				ai->nrates = OSS_MAX_SAMPLE_RATES;
 
 			for (i = 0; i < ai->nrates; i++)
 				ai->rates[i] = rates[i];
 			
 			ai->next_play_engine = 0;
 			ai->next_rec_engine = 0;
 
 			CHN_UNLOCK(ch);
 		}
 
 		PCM_UNLOCK(d);
 
 		if (devname != NULL)
 			return (0);
 	}
 
 	/* Exhausted the search -- nothing is locked, so return. */
 	return (EINVAL);
 }
 
 /**
  * @brief Assigns a PCM channel to a sync group.
  *
  * Sync groups are used to enable audio operations on multiple devices
  * simultaneously.  They may be used with any number of devices and may
  * span across applications.  Devices are added to groups with
  * the SNDCTL_DSP_SYNCGROUP ioctl, and operations are triggered with the
  * SNDCTL_DSP_SYNCSTART ioctl.
  *
  * If the @c id field of the @c group parameter is set to zero, then a new
  * sync group is created.  Otherwise, wrch and rdch (if set) are added to
  * the group specified.
  *
  * @todo As far as memory allocation, should we assume that things are
  * 	 okay and allocate with M_WAITOK before acquiring channel locks,
  * 	 freeing later if not?
  *
  * @param wrch	output channel associated w/ device (if any)
  * @param rdch	input channel associated w/ device (if any)
  * @param group Sync group parameters
  *
  * @retval 0		success
  * @retval non-zero	error to be propagated upstream
  */
 static int
 dsp_oss_syncgroup(struct pcm_channel *wrch, struct pcm_channel *rdch, oss_syncgroup *group)
 {
 	struct pcmchan_syncmember *smrd, *smwr;
 	struct pcmchan_syncgroup *sg;
 	int ret, sg_ids[3];
 
 	smrd = NULL;
 	smwr = NULL;
 	sg = NULL;
 	ret = 0;
 
 	/*
 	 * Free_unr() may sleep, so store released syncgroup IDs until after
 	 * all locks are released.
 	 */
 	sg_ids[0] = sg_ids[1] = sg_ids[2] = 0;
 
 	PCM_SG_LOCK();
 
 	/*
 	 * - Insert channel(s) into group's member list.
 	 * - Set CHN_F_NOTRIGGER on channel(s).
 	 * - Stop channel(s).  
 	 */
 
 	/*
 	 * If device's channels are already mapped to a group, unmap them.
 	 */
 	if (wrch) {
 		CHN_LOCK(wrch);
 		sg_ids[0] = chn_syncdestroy(wrch);
 	}
 
 	if (rdch) {
 		CHN_LOCK(rdch);
 		sg_ids[1] = chn_syncdestroy(rdch);
 	}
 
 	/*
 	 * Verify that mode matches character device properites.
 	 *  - Bail if PCM_ENABLE_OUTPUT && wrch == NULL.
 	 *  - Bail if PCM_ENABLE_INPUT && rdch == NULL.
 	 */
 	if (((wrch == NULL) && (group->mode & PCM_ENABLE_OUTPUT)) ||
 	    ((rdch == NULL) && (group->mode & PCM_ENABLE_INPUT))) {
 		ret = EINVAL;
 		goto out;
 	}
 
 	/*
 	 * An id of zero indicates the user wants to create a new
 	 * syncgroup.
 	 */
 	if (group->id == 0) {
 		sg = (struct pcmchan_syncgroup *)malloc(sizeof(*sg), M_DEVBUF, M_NOWAIT);
 		if (sg != NULL) {
 			SLIST_INIT(&sg->members);
 			sg->id = alloc_unr(pcmsg_unrhdr);
 
 			group->id = sg->id;
 			SLIST_INSERT_HEAD(&snd_pcm_syncgroups, sg, link);
 		} else
 			ret = ENOMEM;
 	} else {
 		SLIST_FOREACH(sg, &snd_pcm_syncgroups, link) {
 			if (sg->id == group->id)
 				break;
 		}
 		if (sg == NULL)
 			ret = EINVAL;
 	}
 
 	/* Couldn't create or find a syncgroup.  Fail. */
 	if (sg == NULL)
 		goto out;
 
 	/*
 	 * Allocate a syncmember, assign it and a channel together, and
 	 * insert into syncgroup.
 	 */
 	if (group->mode & PCM_ENABLE_INPUT) {
 		smrd = (struct pcmchan_syncmember *)malloc(sizeof(*smrd), M_DEVBUF, M_NOWAIT);
 		if (smrd == NULL) {
 			ret = ENOMEM;
 			goto out;
 		}
 
 		SLIST_INSERT_HEAD(&sg->members, smrd, link);
 		smrd->parent = sg;
 		smrd->ch = rdch;
 
 		chn_abort(rdch);
 		rdch->flags |= CHN_F_NOTRIGGER;
 		rdch->sm = smrd;
 	}
 
 	if (group->mode & PCM_ENABLE_OUTPUT) {
 		smwr = (struct pcmchan_syncmember *)malloc(sizeof(*smwr), M_DEVBUF, M_NOWAIT);
 		if (smwr == NULL) {
 			ret = ENOMEM;
 			goto out;
 		}
 
 		SLIST_INSERT_HEAD(&sg->members, smwr, link);
 		smwr->parent = sg;
 		smwr->ch = wrch;
 
 		chn_abort(wrch);
 		wrch->flags |= CHN_F_NOTRIGGER;
 		wrch->sm = smwr;
 	}
 
 out:
 	if (ret != 0) {
 		if (smrd != NULL)
 			free(smrd, M_DEVBUF);
 		if ((sg != NULL) && SLIST_EMPTY(&sg->members)) {
 			sg_ids[2] = sg->id;
 			SLIST_REMOVE(&snd_pcm_syncgroups, sg, pcmchan_syncgroup, link);
 			free(sg, M_DEVBUF);
 		}
 
 		if (wrch)
 			wrch->sm = NULL;
 		if (rdch)
 			rdch->sm = NULL;
 	}
 
 	if (wrch)
 		CHN_UNLOCK(wrch);
 	if (rdch)
 		CHN_UNLOCK(rdch);
 
 	PCM_SG_UNLOCK();
 
 	if (sg_ids[0])
 		free_unr(pcmsg_unrhdr, sg_ids[0]);
 	if (sg_ids[1])
 		free_unr(pcmsg_unrhdr, sg_ids[1]);
 	if (sg_ids[2])
 		free_unr(pcmsg_unrhdr, sg_ids[2]);
 
 	return (ret);
 }
 
 /**
  * @brief Launch a sync group into action
  *
  * Sync groups are established via SNDCTL_DSP_SYNCGROUP.  This function
  * iterates over all members, triggering them along the way.
  *
  * @note Caller must not hold any channel locks.
  *
  * @param sg_id	sync group identifier
  *
  * @retval 0	success
  * @retval non-zero	error worthy of propagating upstream to user
  */
 static int
 dsp_oss_syncstart(int sg_id)
 {
 	struct pcmchan_syncmember *sm, *sm_tmp;
 	struct pcmchan_syncgroup *sg;
 	struct pcm_channel *c;
 	int ret, needlocks;
 
 	/* Get the synclists lock */
 	PCM_SG_LOCK();
 
 	do {
 		ret = 0;
 		needlocks = 0;
 
 		/* Search for syncgroup by ID */
 		SLIST_FOREACH(sg, &snd_pcm_syncgroups, link) {
 			if (sg->id == sg_id)
 				break;
 		}
 
 		/* Return EINVAL if not found */
 		if (sg == NULL) {
 			ret = EINVAL;
 			break;
 		}
 
 		/* Any removals resulting in an empty group should've handled this */
 		KASSERT(!SLIST_EMPTY(&sg->members), ("found empty syncgroup"));
 
 		/*
 		 * Attempt to lock all member channels - if any are already
 		 * locked, unlock those acquired, sleep for a bit, and try
 		 * again.
 		 */
 		SLIST_FOREACH(sm, &sg->members, link) {
 			if (CHN_TRYLOCK(sm->ch) == 0) {
 				int timo = hz * 5/1000; 
 				if (timo < 1)
 					timo = 1;
 
 				/* Release all locked channels so far, retry */
 				SLIST_FOREACH(sm_tmp, &sg->members, link) {
 					/* sm is the member already locked */
 					if (sm == sm_tmp)
 						break;
 					CHN_UNLOCK(sm_tmp->ch);
 				}
 
 				/** @todo Is PRIBIO correct/ */
 				ret = msleep(sm, &snd_pcm_syncgroups_mtx,
 				    PRIBIO | PCATCH, "pcmsg", timo);
 				if (ret == EINTR || ret == ERESTART)
 					break;
 
 				needlocks = 1;
 				ret = 0; /* Assumes ret == EAGAIN... */
 			}
 		}
 	} while (needlocks && ret == 0);
 
 	/* Proceed only if no errors encountered. */
 	if (ret == 0) {
 		/* Launch channels */
 		while ((sm = SLIST_FIRST(&sg->members)) != NULL) {
 			SLIST_REMOVE_HEAD(&sg->members, link);
 
 			c = sm->ch;
 			c->sm = NULL;
 			chn_start(c, 1);
 			c->flags &= ~CHN_F_NOTRIGGER;
 			CHN_UNLOCK(c);
 
 			free(sm, M_DEVBUF);
 		}
 
 		SLIST_REMOVE(&snd_pcm_syncgroups, sg, pcmchan_syncgroup, link);
 		free(sg, M_DEVBUF);
 	}
 
 	PCM_SG_UNLOCK();
 
 	/*
 	 * Free_unr() may sleep, so be sure to give up the syncgroup lock
 	 * first.
 	 */
 	if (ret == 0)
 		free_unr(pcmsg_unrhdr, sg_id);
 
 	return (ret);
 }
 
 /**
  * @brief Handler for SNDCTL_DSP_POLICY
  *
  * The SNDCTL_DSP_POLICY ioctl is a simpler interface to control fragment
  * size and count like with SNDCTL_DSP_SETFRAGMENT.  Instead of the user
  * specifying those two parameters, s/he simply selects a number from 0..10
  * which corresponds to a buffer size.  Smaller numbers request smaller
  * buffers with lower latencies (at greater overhead from more frequent
  * interrupts), while greater numbers behave in the opposite manner.
  *
  * The 4Front spec states that a value of 5 should be the default.  However,
  * this implementation deviates slightly by using a linear scale without
  * consulting drivers.  I.e., even though drivers may have different default
  * buffer sizes, a policy argument of 5 will have the same result across
  * all drivers.
  *
  * See http://manuals.opensound.com/developer/SNDCTL_DSP_POLICY.html for
  * more information.
  *
  * @todo When SNDCTL_DSP_COOKEDMODE is supported, it'll be necessary to
  * 	 work with hardware drivers directly.
  *
  * @note PCM channel arguments must not be locked by caller.
  *
  * @param wrch	Pointer to opened playback channel (optional; may be NULL)
  * @param rdch	" recording channel (optional; may be NULL)
  * @param policy Integer from [0:10]
  *
  * @retval 0	constant (for now)
  */
 static int
 dsp_oss_policy(struct pcm_channel *wrch, struct pcm_channel *rdch, int policy)
 {
 	int ret;
 
 	if (policy < CHN_POLICY_MIN || policy > CHN_POLICY_MAX)
 		return (EIO);
 
 	/* Default: success */
 	ret = 0;
 
 	if (rdch) {
 		CHN_LOCK(rdch);
 		ret = chn_setlatency(rdch, policy);
 		CHN_UNLOCK(rdch);
 	}
 
 	if (wrch && ret == 0) {
 		CHN_LOCK(wrch);
 		ret = chn_setlatency(wrch, policy);
 		CHN_UNLOCK(wrch);
 	}
 
 	if (ret)
 		ret = EIO;
 
 	return (ret);
 }
 
 /**
  * @brief Enable or disable "cooked" mode
  *
  * This is a handler for @c SNDCTL_DSP_COOKEDMODE.  When in cooked mode, which
  * is the default, the sound system handles rate and format conversions
  * automatically (ex: user writing 11025Hz/8 bit/unsigned but card only
  * operates with 44100Hz/16bit/signed samples).
  *
  * Disabling cooked mode is intended for applications wanting to mmap()
  * a sound card's buffer space directly, bypassing the FreeBSD 2-stage
  * feeder architecture, presumably to gain as much control over audio
  * hardware as possible.
  *
  * See @c http://manuals.opensound.com/developer/SNDCTL_DSP_COOKEDMODE.html
  * for more details.
  *
  * @param wrch		playback channel (optional; may be NULL)
  * @param rdch		recording channel (optional; may be NULL)
  * @param enabled	0 = raw mode, 1 = cooked mode
  *
  * @retval EINVAL	Operation not yet supported.
  */
 static int
 dsp_oss_cookedmode(struct pcm_channel *wrch, struct pcm_channel *rdch, int enabled)
 {
 
 	/*
 	 * XXX I just don't get it. Why don't they call it
 	 * "BITPERFECT" ~ SNDCTL_DSP_BITPERFECT !?!?.
 	 * This is just plain so confusing, incoherent,
 	 * <insert any non-printable characters here>.
 	 */
 	if (!(enabled == 1 || enabled == 0))
 		return (EINVAL);
 
 	/*
 	 * I won't give in. I'm inverting its logic here and now.
 	 * Brag all you want, but "BITPERFECT" should be the better
 	 * term here.
 	 */
 	enabled ^= 0x00000001;
 
 	if (wrch != NULL) {
 		CHN_LOCK(wrch);
 		wrch->flags &= ~CHN_F_BITPERFECT;
 		wrch->flags |= (enabled != 0) ? CHN_F_BITPERFECT : 0x00000000;
 		CHN_UNLOCK(wrch);
 	}
 
 	if (rdch != NULL) {
 		CHN_LOCK(rdch);
 		rdch->flags &= ~CHN_F_BITPERFECT;
 		rdch->flags |= (enabled != 0) ? CHN_F_BITPERFECT : 0x00000000;
 		CHN_UNLOCK(rdch);
 	}
 
 	return (0);
 }
 
 /**
  * @brief Retrieve channel interleaving order
  *
  * This is the handler for @c SNDCTL_DSP_GET_CHNORDER.
  *
  * See @c http://manuals.opensound.com/developer/SNDCTL_DSP_GET_CHNORDER.html
  * for more details.
  *
  * @note As the ioctl definition is still under construction, FreeBSD
  * 	 does not currently support SNDCTL_DSP_GET_CHNORDER.
  *
  * @param wrch	playback channel (optional; may be NULL)
  * @param rdch	recording channel (optional; may be NULL)
  * @param map	channel map (result will be stored there)
  *
  * @retval EINVAL	Operation not yet supported.
  */
 static int
 dsp_oss_getchnorder(struct pcm_channel *wrch, struct pcm_channel *rdch, unsigned long long *map)
 {
 	struct pcm_channel *ch;
 	int ret;
 
 	ch = (wrch != NULL) ? wrch : rdch;
 	if (ch != NULL) {
 		CHN_LOCK(ch);
 		ret = chn_oss_getorder(ch, map);
 		CHN_UNLOCK(ch);
 	} else
 		ret = EINVAL;
 
 	return (ret);
 }
 
 /**
  * @brief Specify channel interleaving order
  *
  * This is the handler for @c SNDCTL_DSP_SET_CHNORDER.
  *
  * @note As the ioctl definition is still under construction, FreeBSD
  * 	 does not currently support @c SNDCTL_DSP_SET_CHNORDER.
  *
  * @param wrch	playback channel (optional; may be NULL)
  * @param rdch	recording channel (optional; may be NULL)
  * @param map	channel map
  *
  * @retval EINVAL	Operation not yet supported.
  */
 static int
 dsp_oss_setchnorder(struct pcm_channel *wrch, struct pcm_channel *rdch, unsigned long long *map)
 {
 	int ret;
 
 	ret = 0;
 
 	if (wrch != NULL) {
 		CHN_LOCK(wrch);
 		ret = chn_oss_setorder(wrch, map);
 		CHN_UNLOCK(wrch);
 	}
 
 	if (ret == 0 && rdch != NULL) {
 		CHN_LOCK(rdch);
 		ret = chn_oss_setorder(rdch, map);
 		CHN_UNLOCK(rdch);
 	}
 
 	return (ret);
 }
 
 static int
 dsp_oss_getchannelmask(struct pcm_channel *wrch, struct pcm_channel *rdch,
     int *mask)
 {
 	struct pcm_channel *ch;
 	uint32_t chnmask;
 	int ret;
 
 	chnmask = 0;
 	ch = (wrch != NULL) ? wrch : rdch;
 
 	if (ch != NULL) {
 		CHN_LOCK(ch);
 		ret = chn_oss_getmask(ch, &chnmask);
 		CHN_UNLOCK(ch);
 	} else
 		ret = EINVAL;
 
 	if (ret == 0)
 		*mask = chnmask;
 
 	return (ret);
 }
 
 #ifdef OSSV4_EXPERIMENT
 /**
  * @brief Retrieve an audio device's label
  *
  * This is a handler for the @c SNDCTL_GETLABEL ioctl.
  *
  * See @c http://manuals.opensound.com/developer/SNDCTL_GETLABEL.html
  * for more details.
  *
  * From Hannu@4Front:  "For example ossxmix (just like some HW mixer
  * consoles) can show variable "labels" for certain controls. By default
  * the application name (say quake) is shown as the label but
  * applications may change the labels themselves."
  *
  * @note As the ioctl definition is still under construction, FreeBSD
  * 	 does not currently support @c SNDCTL_GETLABEL.
  *
  * @param wrch	playback channel (optional; may be NULL)
  * @param rdch	recording channel (optional; may be NULL)
  * @param label	label gets copied here
  *
  * @retval EINVAL	Operation not yet supported.
  */
 static int
 dsp_oss_getlabel(struct pcm_channel *wrch, struct pcm_channel *rdch, oss_label_t *label)
 {
 	return (EINVAL);
 }
 
 /**
  * @brief Specify an audio device's label
  *
  * This is a handler for the @c SNDCTL_SETLABEL ioctl.  Please see the
  * comments for @c dsp_oss_getlabel immediately above.
  *
  * See @c http://manuals.opensound.com/developer/SNDCTL_GETLABEL.html
  * for more details.
  *
  * @note As the ioctl definition is still under construction, FreeBSD
  * 	 does not currently support SNDCTL_SETLABEL.
  *
  * @param wrch	playback channel (optional; may be NULL)
  * @param rdch	recording channel (optional; may be NULL)
  * @param label	label gets copied from here
  *
  * @retval EINVAL	Operation not yet supported.
  */
 static int
 dsp_oss_setlabel(struct pcm_channel *wrch, struct pcm_channel *rdch, oss_label_t *label)
 {
 	return (EINVAL);
 }
 
 /**
  * @brief Retrieve name of currently played song
  *
  * This is a handler for the @c SNDCTL_GETSONG ioctl.  Audio players could
  * tell the system the name of the currently playing song, which would be
  * visible in @c /dev/sndstat.
  *
  * See @c http://manuals.opensound.com/developer/SNDCTL_GETSONG.html
  * for more details.
  *
  * @note As the ioctl definition is still under construction, FreeBSD
  * 	 does not currently support SNDCTL_GETSONG.
  *
  * @param wrch	playback channel (optional; may be NULL)
  * @param rdch	recording channel (optional; may be NULL)
  * @param song	song name gets copied here
  *
  * @retval EINVAL	Operation not yet supported.
  */
 static int
 dsp_oss_getsong(struct pcm_channel *wrch, struct pcm_channel *rdch, oss_longname_t *song)
 {
 	return (EINVAL);
 }
 
 /**
  * @brief Retrieve name of currently played song
  *
  * This is a handler for the @c SNDCTL_SETSONG ioctl.  Audio players could
  * tell the system the name of the currently playing song, which would be
  * visible in @c /dev/sndstat.
  *
  * See @c http://manuals.opensound.com/developer/SNDCTL_SETSONG.html
  * for more details.
  *
  * @note As the ioctl definition is still under construction, FreeBSD
  * 	 does not currently support SNDCTL_SETSONG.
  *
  * @param wrch	playback channel (optional; may be NULL)
  * @param rdch	recording channel (optional; may be NULL)
  * @param song	song name gets copied from here
  *
  * @retval EINVAL	Operation not yet supported.
  */
 static int
 dsp_oss_setsong(struct pcm_channel *wrch, struct pcm_channel *rdch, oss_longname_t *song)
 {
 	return (EINVAL);
 }
 
 /**
  * @brief Rename a device
  *
  * This is a handler for the @c SNDCTL_SETNAME ioctl.
  *
  * See @c http://manuals.opensound.com/developer/SNDCTL_SETNAME.html for
  * more details.
  *
  * From Hannu@4Front:  "This call is used to change the device name
  * reported in /dev/sndstat and ossinfo. So instead of  using some generic
  * 'OSS loopback audio (MIDI) driver' the device may be given a meaningfull
  * name depending on the current context (for example 'OSS virtual wave table
  * synth' or 'VoIP link to London')."
  *
  * @note As the ioctl definition is still under construction, FreeBSD
  * 	 does not currently support SNDCTL_SETNAME.
  *
  * @param wrch	playback channel (optional; may be NULL)
  * @param rdch	recording channel (optional; may be NULL)
  * @param name	new device name gets copied from here
  *
  * @retval EINVAL	Operation not yet supported.
  */
 static int
 dsp_oss_setname(struct pcm_channel *wrch, struct pcm_channel *rdch, oss_longname_t *name)
 {
 	return (EINVAL);
 }
 #endif	/* !OSSV4_EXPERIMENT */
diff --git a/sys/dev/sound/pcm/dsp.h b/sys/dev/sound/pcm/dsp.h
index a83d9e5b0f8b..6098c0641eb5 100644
--- a/sys/dev/sound/pcm/dsp.h
+++ b/sys/dev/sound/pcm/dsp.h
@@ -1,44 +1,41 @@
 /*-
  * SPDX-License-Identifier: BSD-2-Clause
  *
  * Copyright (c) 2005-2009 Ariff Abdullah <ariff@FreeBSD.org>
  * Portions Copyright (c) Ryan Beasley <ryan.beasley@gmail.com> - GSoC 2006
  * Copyright (c) 1999 Cameron Grant <cg@FreeBSD.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
 
 #ifndef _PCMDSP_H_
 #define _PCMDSP_H_
 
 extern struct cdevsw dsp_cdevsw;
 
-struct dsp_cdevinfo;
-
+int dsp_make_dev(device_t);
+void dsp_destroy_dev(device_t);
 char *dsp_unit2name(char *, size_t, int);
 int dsp_oss_audioinfo(struct cdev *, oss_audioinfo *);
 
-void dsp_cdevinfo_init(struct snddev_info *);
-void dsp_cdevinfo_flush(struct snddev_info *);
-
 #endif /* !_PCMDSP_H_ */
diff --git a/sys/dev/sound/pcm/sound.c b/sys/dev/sound/pcm/sound.c
index c03e4fa435e1..36a6f778e024 100644
--- a/sys/dev/sound/pcm/sound.c
+++ b/sys/dev/sound/pcm/sound.c
@@ -1,1560 +1,1370 @@
 /*-
  * SPDX-License-Identifier: BSD-2-Clause
  *
  * Copyright (c) 2005-2009 Ariff Abdullah <ariff@FreeBSD.org>
  * Portions Copyright (c) Ryan Beasley <ryan.beasley@gmail.com> - GSoC 2006
  * Copyright (c) 1999 Cameron Grant <cg@FreeBSD.org>
  * Copyright (c) 1997 Luigi Rizzo
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
 
 #ifdef HAVE_KERNEL_OPTION_HEADERS
 #include "opt_snd.h"
 #endif
 
 #include <dev/sound/pcm/sound.h>
 #include <dev/sound/pcm/ac97.h>
 #include <dev/sound/pcm/vchan.h>
 #include <dev/sound/pcm/dsp.h>
 #include <dev/sound/version.h>
 #include <sys/limits.h>
 #include <sys/sysctl.h>
 
 #include "feeder_if.h"
 
 devclass_t pcm_devclass;
 
 int pcm_veto_load = 1;
 
 int snd_unit = -1;
 
 static int snd_unit_auto = -1;
 SYSCTL_INT(_hw_snd, OID_AUTO, default_auto, CTLFLAG_RWTUN,
     &snd_unit_auto, 0, "assign default unit to a newly attached device");
 
 int snd_maxautovchans = 16;
 
 SYSCTL_NODE(_hw, OID_AUTO, snd, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
     "Sound driver");
 
 static void pcm_sysinit(device_t);
 
 /*
  * XXX I've had enough with people not telling proper version/arch
  *     while reporting problems, not after 387397913213th questions/requests.
  */
 static char snd_driver_version[] =
     __XSTRING(SND_DRV_VERSION)"/"MACHINE_ARCH;
 SYSCTL_STRING(_hw_snd, OID_AUTO, version, CTLFLAG_RD, &snd_driver_version,
     0, "driver version/arch");
 
 /**
  * @brief Unit number allocator for syncgroup IDs
  */
 struct unrhdr *pcmsg_unrhdr = NULL;
 
 static int
 sndstat_prepare_pcm(struct sbuf *s, device_t dev, int verbose)
 {
 	struct snddev_info *d;
 	struct pcm_channel *c;
 	struct pcm_feeder *f;
 
 	d = device_get_softc(dev);
 	PCM_BUSYASSERT(d);
 
 	if (CHN_EMPTY(d, channels.pcm)) {
 		sbuf_printf(s, " (mixer only)");
 		return (0);
 	}
 
 	if (verbose < 1) {
 		sbuf_printf(s, " (%s%s%s",
 		    d->playcount ? "play" : "",
 		    (d->playcount && d->reccount) ? "/" : "",
 		    d->reccount ? "rec" : "");
 	} else {
 		sbuf_printf(s, " (%dp:%dv/%dr:%dv",
 		    d->playcount, d->pvchancount,
 		    d->reccount, d->rvchancount);
 	}
 	sbuf_printf(s, "%s)%s",
 	    ((d->playcount != 0 && d->reccount != 0) &&
 	    (d->flags & SD_F_SIMPLEX)) ? " simplex" : "",
 	    (device_get_unit(dev) == snd_unit) ? " default" : "");
 
 	if (verbose <= 1)
 		return (0);
 
 	sbuf_printf(s, "\n\t");
 	sbuf_printf(s, "snddev flags=0x%b", d->flags, SD_F_BITS);
 
 	CHN_FOREACH(c, d, channels.pcm) {
 		KASSERT(c->bufhard != NULL && c->bufsoft != NULL,
 		    ("hosed pcm channel setup"));
 
 		sbuf_printf(s, "\n\t");
 
 		sbuf_printf(s, "%s[%s]: ",
 		    (c->parentchannel != NULL) ?
 		    c->parentchannel->name : "", c->name);
 		sbuf_printf(s, "spd %d", c->speed);
 		if (c->speed != sndbuf_getspd(c->bufhard)) {
 			sbuf_printf(s, "/%d",
 			    sndbuf_getspd(c->bufhard));
 		}
 		sbuf_printf(s, ", fmt 0x%08x", c->format);
 		if (c->format != sndbuf_getfmt(c->bufhard)) {
 			sbuf_printf(s, "/0x%08x",
 			    sndbuf_getfmt(c->bufhard));
 		}
 		sbuf_printf(s, ", flags 0x%08x, 0x%08x",
 		    c->flags, c->feederflags);
 		if (c->pid != -1) {
 			sbuf_printf(s, ", pid %d (%s)",
 			    c->pid, c->comm);
 		}
 		sbuf_printf(s, "\n\t");
 
 		sbuf_printf(s, "interrupts %d, ", c->interrupts);
 
 		if (c->direction == PCMDIR_REC)	{
 			sbuf_printf(s,
 			    "overruns %d, feed %u, hfree %d, "
 			    "sfree %d [b:%d/%d/%d|bs:%d/%d/%d]",
 				c->xruns, c->feedcount,
 				sndbuf_getfree(c->bufhard),
 				sndbuf_getfree(c->bufsoft),
 				sndbuf_getsize(c->bufhard),
 				sndbuf_getblksz(c->bufhard),
 				sndbuf_getblkcnt(c->bufhard),
 				sndbuf_getsize(c->bufsoft),
 				sndbuf_getblksz(c->bufsoft),
 				sndbuf_getblkcnt(c->bufsoft));
 		} else {
 			sbuf_printf(s,
 			    "underruns %d, feed %u, ready %d "
 			    "[b:%d/%d/%d|bs:%d/%d/%d]",
 				c->xruns, c->feedcount,
 				sndbuf_getready(c->bufsoft),
 				sndbuf_getsize(c->bufhard),
 				sndbuf_getblksz(c->bufhard),
 				sndbuf_getblkcnt(c->bufhard),
 				sndbuf_getsize(c->bufsoft),
 				sndbuf_getblksz(c->bufsoft),
 				sndbuf_getblkcnt(c->bufsoft));
 		}
 		sbuf_printf(s, "\n\t");
 
 		sbuf_printf(s, "channel flags=0x%b", c->flags, CHN_F_BITS);
 		sbuf_printf(s, "\n\t");
 
 		sbuf_printf(s, "{%s}",
 		    (c->direction == PCMDIR_REC) ? "hardware" : "userland");
 		sbuf_printf(s, " -> ");
 		f = c->feeder;
 		while (f->source != NULL)
 			f = f->source;
 		while (f != NULL) {
 			sbuf_printf(s, "%s", f->class->name);
 			if (f->desc->type == FEEDER_FORMAT) {
 				sbuf_printf(s, "(0x%08x -> 0x%08x)",
 				    f->desc->in, f->desc->out);
 			} else if (f->desc->type == FEEDER_MATRIX) {
 				sbuf_printf(s, "(%d.%d -> %d.%d)",
 				    AFMT_CHANNEL(f->desc->in) -
 				    AFMT_EXTCHANNEL(f->desc->in),
 				    AFMT_EXTCHANNEL(f->desc->in),
 				    AFMT_CHANNEL(f->desc->out) -
 				    AFMT_EXTCHANNEL(f->desc->out),
 				    AFMT_EXTCHANNEL(f->desc->out));
 			} else if (f->desc->type == FEEDER_RATE) {
 				sbuf_printf(s,
 				    "(0x%08x q:%d %d -> %d)",
 				    f->desc->out,
 				    FEEDER_GET(f, FEEDRATE_QUALITY),
 				    FEEDER_GET(f, FEEDRATE_SRC),
 				    FEEDER_GET(f, FEEDRATE_DST));
 			} else {
 				sbuf_printf(s, "(0x%08x)",
 				    f->desc->out);
 			}
 			sbuf_printf(s, " -> ");
 			f = f->parent;
 		}
 		sbuf_printf(s, "{%s}",
 		    (c->direction == PCMDIR_REC) ? "userland" : "hardware");
 	}
 
 	return (0);
 }
 
 void *
 snd_mtxcreate(const char *desc, const char *type)
 {
 	struct mtx *m;
 
 	m = malloc(sizeof(*m), M_DEVBUF, M_WAITOK | M_ZERO);
 	mtx_init(m, desc, type, MTX_DEF);
 	return m;
 }
 
 void
 snd_mtxfree(void *m)
 {
 	struct mtx *mtx = m;
 
 	mtx_destroy(mtx);
 	free(mtx, M_DEVBUF);
 }
 
 void
 snd_mtxassert(void *m)
 {
 #ifdef INVARIANTS
 	struct mtx *mtx = m;
 
 	mtx_assert(mtx, MA_OWNED);
 #endif
 }
 
 int
 snd_setup_intr(device_t dev, struct resource *res, int flags, driver_intr_t hand, void *param, void **cookiep)
 {
 	struct snddev_info *d;
 
 	flags &= INTR_MPSAFE;
 	flags |= INTR_TYPE_AV;
 	d = device_get_softc(dev);
 	if (d != NULL && (flags & INTR_MPSAFE))
 		d->flags |= SD_F_MPSAFE;
 
 	return bus_setup_intr(dev, res, flags, NULL, hand, param, cookiep);
 }
 
-static void
-pcm_clonereset(struct snddev_info *d)
-{
-	int cmax;
-
-	PCM_BUSYASSERT(d);
-
-	cmax = d->playcount + d->reccount - 1;
-	if (d->pvchancount > 0)
-		cmax += max(d->pvchancount, snd_maxautovchans) - 1;
-	if (d->rvchancount > 0)
-		cmax += max(d->rvchancount, snd_maxautovchans) - 1;
-	if (cmax > PCMMAXCLONE)
-		cmax = PCMMAXCLONE;
-	(void)snd_clone_gc(d->clones);
-	(void)snd_clone_setmaxunit(d->clones, cmax);
-}
-
 int
 pcm_setvchans(struct snddev_info *d, int direction, int newcnt, int num)
 {
 	struct pcm_channel *c, *ch, *nch;
 	struct pcmchan_caps *caps;
 	int i, err, vcnt;
 
 	PCM_BUSYASSERT(d);
 
 	if ((direction == PCMDIR_PLAY && d->playcount < 1) ||
 	    (direction == PCMDIR_REC && d->reccount < 1))
 		return (ENODEV);
 
 	if (!(d->flags & SD_F_AUTOVCHAN))
 		return (EINVAL);
 
 	if (newcnt < 0 || newcnt > SND_MAXVCHANS)
 		return (E2BIG);
 
 	if (direction == PCMDIR_PLAY)
 		vcnt = d->pvchancount;
 	else if (direction == PCMDIR_REC)
 		vcnt = d->rvchancount;
 	else
 		return (EINVAL);
 
 	if (newcnt > vcnt) {
 		KASSERT(num == -1 ||
 		    (num >= 0 && num < SND_MAXVCHANS && (newcnt - 1) == vcnt),
 		    ("bogus vchan_create() request num=%d newcnt=%d vcnt=%d",
 		    num, newcnt, vcnt));
 		/* add new vchans - find a parent channel first */
 		ch = NULL;
 		CHN_FOREACH(c, d, channels.pcm) {
 			CHN_LOCK(c);
 			if (c->direction == direction &&
 			    ((c->flags & CHN_F_HAS_VCHAN) || (vcnt == 0 &&
 			    c->refcount < 1 &&
 			    !(c->flags & (CHN_F_BUSY | CHN_F_VIRTUAL))))) {
 				/* 
 				 * Reuse hw channel with vchans already
 				 * created.
 				 */
 				if (c->flags & CHN_F_HAS_VCHAN) {
 					ch = c;
 					break;
 				}
 				/*
 				 * No vchans ever created, look for
 				 * channels with supported formats.
 				 */
 				caps = chn_getcaps(c);
 				if (caps == NULL) {
 					CHN_UNLOCK(c);
 					continue;
 				}
 				for (i = 0; caps->fmtlist[i] != 0; i++) {
 					if (caps->fmtlist[i] & AFMT_CONVERTIBLE)
 						break;
 				}
 				if (caps->fmtlist[i] != 0) {
 					ch = c;
 				    	break;
 				}
 			}
 			CHN_UNLOCK(c);
 		}
 		if (ch == NULL)
 			return (EBUSY);
 		ch->flags |= CHN_F_BUSY;
 		err = 0;
 		while (err == 0 && newcnt > vcnt) {
 			err = vchan_create(ch, num);
 			if (err == 0)
 				vcnt++;
 			else if (err == E2BIG && newcnt > vcnt)
 				device_printf(d->dev,
 				    "%s: err=%d Maximum channel reached.\n",
 				    __func__, err);
 		}
 		if (vcnt == 0)
 			ch->flags &= ~CHN_F_BUSY;
 		CHN_UNLOCK(ch);
 		if (err != 0)
 			return (err);
-		else
-			pcm_clonereset(d);
 	} else if (newcnt < vcnt) {
 		KASSERT(num == -1,
 		    ("bogus vchan_destroy() request num=%d", num));
 		CHN_FOREACH(c, d, channels.pcm) {
 			CHN_LOCK(c);
 			if (c->direction != direction ||
 			    CHN_EMPTY(c, children) ||
 			    !(c->flags & CHN_F_HAS_VCHAN)) {
 				CHN_UNLOCK(c);
 				continue;
 			}
 			CHN_FOREACH_SAFE(ch, c, nch, children) {
 				CHN_LOCK(ch);
 				if (vcnt == 1 && c->refcount > 0) {
 					CHN_UNLOCK(ch);
 					break;
 				}
 				if (!(ch->flags & CHN_F_BUSY) &&
 				    ch->refcount < 1) {
 					err = vchan_destroy(ch);
 					if (err == 0)
 						vcnt--;
 				} else
 					CHN_UNLOCK(ch);
 				if (vcnt == newcnt)
 					break;
 			}
 			CHN_UNLOCK(c);
 			break;
 		}
-		pcm_clonereset(d);
 	}
 
 	return (0);
 }
 
 /* return error status and a locked channel */
 int
 pcm_chnalloc(struct snddev_info *d, struct pcm_channel **ch, int direction,
     pid_t pid, char *comm, int devunit)
 {
 	struct pcm_channel *c;
 	int err, vchancount, vchan_num;
 
 	KASSERT(d != NULL && ch != NULL && (devunit == -1 ||
 	    !(devunit & ~(SND_U_MASK | SND_D_MASK | SND_C_MASK))) &&
 	    (direction == PCMDIR_PLAY || direction == PCMDIR_REC),
 	    ("%s(): invalid d=%p ch=%p direction=%d pid=%d devunit=%d",
 	    __func__, d, ch, direction, pid, devunit));
 	PCM_BUSYASSERT(d);
 
 	/* Double check again. */
 	if (devunit != -1) {
 		switch (snd_unit2d(devunit)) {
 		case SND_DEV_DSPHW_PLAY:
 		case SND_DEV_DSPHW_VPLAY:
 			if (direction != PCMDIR_PLAY)
 				return (ENOTSUP);
 			break;
 		case SND_DEV_DSPHW_REC:
 		case SND_DEV_DSPHW_VREC:
 			if (direction != PCMDIR_REC)
 				return (ENOTSUP);
 			break;
 		default:
 			if (!(direction == PCMDIR_PLAY ||
 			    direction == PCMDIR_REC))
 				return (ENOTSUP);
 			break;
 		}
 	}
 
 	*ch = NULL;
 	vchan_num = 0;
 	vchancount = (direction == PCMDIR_PLAY) ? d->pvchancount :
 	    d->rvchancount;
 
 retry_chnalloc:
 	err = ENOTSUP;
 	/* scan for a free channel */
 	CHN_FOREACH(c, d, channels.pcm) {
 		CHN_LOCK(c);
 		if (devunit == -1 && c->direction == direction &&
 		    (c->flags & CHN_F_VIRTUAL)) {
 			if (vchancount < snd_maxautovchans &&
 			    vchan_num < CHN_CHAN(c)) {
 			    	CHN_UNLOCK(c);
 				goto vchan_alloc;
 			}
 			vchan_num++;
 		}
 		if (c->direction == direction && !(c->flags & CHN_F_BUSY) &&
 		    (devunit == -1 || devunit == -2 || c->unit == devunit)) {
 			c->flags |= CHN_F_BUSY;
 			c->pid = pid;
 			strlcpy(c->comm, (comm != NULL) ? comm :
 			    CHN_COMM_UNKNOWN, sizeof(c->comm));
 			*ch = c;
 			return (0);
 		} else if (c->unit == devunit) {
 			if (c->direction != direction)
 				err = ENOTSUP;
 			else if (c->flags & CHN_F_BUSY)
 				err = EBUSY;
 			else
 				err = EINVAL;
 			CHN_UNLOCK(c);
 			return (err);
 		} else if ((devunit == -1 || devunit == -2) &&
 		    c->direction == direction && (c->flags & CHN_F_BUSY))
 			err = EBUSY;
 		CHN_UNLOCK(c);
 	}
 
 	if (devunit == -2)
 		return (err);
 
 vchan_alloc:
 	/* no channel available */
 	if (devunit == -1 || snd_unit2d(devunit) == SND_DEV_DSPHW_VPLAY ||
 	    snd_unit2d(devunit) == SND_DEV_DSPHW_VREC) {
 		if (!(vchancount > 0 && vchancount < snd_maxautovchans) &&
 		    (devunit == -1 || snd_unit2c(devunit) < snd_maxautovchans))
 			return (err);
 		err = pcm_setvchans(d, direction, vchancount + 1,
 		    (devunit == -1) ? -1 : snd_unit2c(devunit));
 		if (err == 0) {
 			if (devunit == -1)
 				devunit = -2;
 			goto retry_chnalloc;
 		}
 	}
 
 	return (err);
 }
 
 /* release a locked channel and unlock it */
 int
 pcm_chnrelease(struct pcm_channel *c)
 {
 	PCM_BUSYASSERT(c->parentsnddev);
 	CHN_LOCKASSERT(c);
 
 	c->flags &= ~CHN_F_BUSY;
 	c->pid = -1;
 	strlcpy(c->comm, CHN_COMM_UNUSED, sizeof(c->comm));
 	CHN_UNLOCK(c);
 
 	return (0);
 }
 
 int
 pcm_chnref(struct pcm_channel *c, int ref)
 {
 	PCM_BUSYASSERT(c->parentsnddev);
 	CHN_LOCKASSERT(c);
 
 	c->refcount += ref;
 
 	return (c->refcount);
 }
 
 static void
 pcm_setmaxautovchans(struct snddev_info *d, int num)
 {
 	PCM_BUSYASSERT(d);
 
 	if (num < 0)
 		return;
 
 	if (num >= 0 && d->pvchancount > num)
 		(void)pcm_setvchans(d, PCMDIR_PLAY, num, -1);
 	else if (num > 0 && d->pvchancount == 0)
 		(void)pcm_setvchans(d, PCMDIR_PLAY, 1, -1);
 
 	if (num >= 0 && d->rvchancount > num)
 		(void)pcm_setvchans(d, PCMDIR_REC, num, -1);
 	else if (num > 0 && d->rvchancount == 0)
 		(void)pcm_setvchans(d, PCMDIR_REC, 1, -1);
-
-	pcm_clonereset(d);
 }
 
 static int
 sysctl_hw_snd_default_unit(SYSCTL_HANDLER_ARGS)
 {
 	struct snddev_info *d;
 	int error, unit;
 
 	unit = snd_unit;
 	error = sysctl_handle_int(oidp, &unit, 0, req);
 	if (error == 0 && req->newptr != NULL) {
 		d = devclass_get_softc(pcm_devclass, unit);
 		if (!PCM_REGISTERED(d) || CHN_EMPTY(d, channels.pcm))
 			return EINVAL;
 		snd_unit = unit;
 		snd_unit_auto = 0;
 	}
 	return (error);
 }
 /* XXX: do we need a way to let the user change the default unit? */
 SYSCTL_PROC(_hw_snd, OID_AUTO, default_unit,
     CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_ANYBODY | CTLFLAG_NEEDGIANT, 0,
     sizeof(int), sysctl_hw_snd_default_unit, "I",
     "default sound device");
 
 static int
 sysctl_hw_snd_maxautovchans(SYSCTL_HANDLER_ARGS)
 {
 	struct snddev_info *d;
 	int i, v, error;
 
 	v = snd_maxautovchans;
 	error = sysctl_handle_int(oidp, &v, 0, req);
 	if (error == 0 && req->newptr != NULL) {
 		if (v < 0)
 			v = 0;
 		if (v > SND_MAXVCHANS)
 			v = SND_MAXVCHANS;
 		snd_maxautovchans = v;
 		for (i = 0; pcm_devclass != NULL &&
 		    i < devclass_get_maxunit(pcm_devclass); i++) {
 			d = devclass_get_softc(pcm_devclass, i);
 			if (!PCM_REGISTERED(d))
 				continue;
 			PCM_ACQUIRE_QUICK(d);
 			pcm_setmaxautovchans(d, v);
 			PCM_RELEASE_QUICK(d);
 		}
 	}
 	return (error);
 }
 SYSCTL_PROC(_hw_snd, OID_AUTO, maxautovchans,
     CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_NEEDGIANT, 0, sizeof(int),
     sysctl_hw_snd_maxautovchans, "I",
     "maximum virtual channel");
 
 struct pcm_channel *
 pcm_chn_create(struct snddev_info *d, struct pcm_channel *parent, kobj_class_t cls, int dir, int num, void *devinfo)
 {
 	struct pcm_channel *ch;
 	int direction, err, rpnum, *pnum, max;
 	int udc, device, chan;
 	char *dirs, *devname, buf[CHN_NAMELEN];
 
 	PCM_BUSYASSERT(d);
 	PCM_LOCKASSERT(d);
 	KASSERT(num >= -1, ("invalid num=%d", num));
 
 	switch (dir) {
 	case PCMDIR_PLAY:
 		dirs = "play";
 		direction = PCMDIR_PLAY;
 		pnum = &d->playcount;
 		device = SND_DEV_DSPHW_PLAY;
 		max = SND_MAXHWCHAN;
 		break;
 	case PCMDIR_PLAY_VIRTUAL:
 		dirs = "virtual";
 		direction = PCMDIR_PLAY;
 		pnum = &d->pvchancount;
 		device = SND_DEV_DSPHW_VPLAY;
 		max = SND_MAXVCHANS;
 		break;
 	case PCMDIR_REC:
 		dirs = "record";
 		direction = PCMDIR_REC;
 		pnum = &d->reccount;
 		device = SND_DEV_DSPHW_REC;
 		max = SND_MAXHWCHAN;
 		break;
 	case PCMDIR_REC_VIRTUAL:
 		dirs = "virtual";
 		direction = PCMDIR_REC;
 		pnum = &d->rvchancount;
 		device = SND_DEV_DSPHW_VREC;
 		max = SND_MAXVCHANS;
 		break;
 	default:
 		return (NULL);
 	}
 
 	chan = (num == -1) ? 0 : num;
 
 	if (*pnum >= max || chan >= max)
 		return (NULL);
 
 	rpnum = 0;
 
 	CHN_FOREACH(ch, d, channels.pcm) {
 		if (CHN_DEV(ch) != device)
 			continue;
 		if (chan == CHN_CHAN(ch)) {
 			if (num != -1) {
 				device_printf(d->dev,
 				    "channel num=%d allocated!\n", chan);
 				return (NULL);
 			}
 			chan++;
 			if (chan >= max) {
 				device_printf(d->dev,
 				    "chan=%d > %d\n", chan, max);
 				return (NULL);
 			}
 		}
 		rpnum++;
 	}
 
 	if (*pnum != rpnum) {
 		device_printf(d->dev,
 		    "%s(): WARNING: pnum screwed : dirs=%s pnum=%d rpnum=%d\n",
 		    __func__, dirs, *pnum, rpnum);
 		return (NULL);
 	}
 
 	udc = snd_mkunit(device_get_unit(d->dev), device, chan);
 	devname = dsp_unit2name(buf, sizeof(buf), udc);
 
 	if (devname == NULL) {
 		device_printf(d->dev,
 		    "Failed to query device name udc=0x%08x\n", udc);
 		return (NULL);
 	}
 
 	PCM_UNLOCK(d);
 	ch = malloc(sizeof(*ch), M_DEVBUF, M_WAITOK | M_ZERO);
 	ch->methods = kobj_create(cls, M_DEVBUF, M_WAITOK | M_ZERO);
 	ch->unit = udc;
 	ch->pid = -1;
 	strlcpy(ch->comm, CHN_COMM_UNUSED, sizeof(ch->comm));
 	ch->parentsnddev = d;
 	ch->parentchannel = parent;
 	ch->dev = d->dev;
 	ch->trigger = PCMTRIG_STOP;
 	snprintf(ch->name, sizeof(ch->name), "%s:%s:%s",
 	    device_get_nameunit(ch->dev), dirs, devname);
 
 	err = chn_init(ch, devinfo, dir, direction);
 	PCM_LOCK(d);
 	if (err) {
 		device_printf(d->dev, "chn_init(%s) failed: err = %d\n",
 		    ch->name, err);
 		kobj_delete(ch->methods, M_DEVBUF);
 		free(ch, M_DEVBUF);
 		return (NULL);
 	}
 
 	return (ch);
 }
 
 int
 pcm_chn_destroy(struct pcm_channel *ch)
 {
 	struct snddev_info *d __diagused;
 	int err;
 
 	d = ch->parentsnddev;
 	PCM_BUSYASSERT(d);
 
 	err = chn_kill(ch);
 	if (err) {
 		device_printf(ch->dev, "chn_kill(%s) failed, err = %d\n",
 		    ch->name, err);
 		return (err);
 	}
 
 	kobj_delete(ch->methods, M_DEVBUF);
 	free(ch, M_DEVBUF);
 
 	return (0);
 }
 
 int
 pcm_chn_add(struct snddev_info *d, struct pcm_channel *ch)
 {
 	PCM_BUSYASSERT(d);
 	PCM_LOCKASSERT(d);
 	KASSERT(ch != NULL && (ch->direction == PCMDIR_PLAY ||
 	    ch->direction == PCMDIR_REC), ("Invalid pcm channel"));
 
 	CHN_INSERT_SORT_ASCEND(d, ch, channels.pcm);
 
 	switch (CHN_DEV(ch)) {
 	case SND_DEV_DSPHW_PLAY:
 		d->playcount++;
 		break;
 	case SND_DEV_DSPHW_VPLAY:
 		d->pvchancount++;
 		break;
 	case SND_DEV_DSPHW_REC:
 		d->reccount++;
 		break;
 	case SND_DEV_DSPHW_VREC:
 		d->rvchancount++;
 		break;
 	default:
 		break;
 	}
 
 	d->devcount++;
 
 	return (0);
 }
 
 int
 pcm_chn_remove(struct snddev_info *d, struct pcm_channel *ch)
 {
 	struct pcm_channel *tmp;
 
 	PCM_BUSYASSERT(d);
 	PCM_LOCKASSERT(d);
 
 	tmp = NULL;
 
 	CHN_FOREACH(tmp, d, channels.pcm) {
 		if (tmp == ch)
 			break;
 	}
 
 	if (tmp != ch)
 		return (EINVAL);
 
 	CHN_REMOVE(d, ch, channels.pcm);
 
 	switch (CHN_DEV(ch)) {
 	case SND_DEV_DSPHW_PLAY:
 		d->playcount--;
 		break;
 	case SND_DEV_DSPHW_VPLAY:
 		d->pvchancount--;
 		break;
 	case SND_DEV_DSPHW_REC:
 		d->reccount--;
 		break;
 	case SND_DEV_DSPHW_VREC:
 		d->rvchancount--;
 		break;
 	default:
 		break;
 	}
 
 	d->devcount--;
 
 	return (0);
 }
 
 int
 pcm_addchan(device_t dev, int dir, kobj_class_t cls, void *devinfo)
 {
 	struct snddev_info *d = device_get_softc(dev);
 	struct pcm_channel *ch;
 	int err;
 
 	PCM_BUSYASSERT(d);
 
 	PCM_LOCK(d);
 	ch = pcm_chn_create(d, NULL, cls, dir, -1, devinfo);
 	if (!ch) {
 		device_printf(d->dev, "pcm_chn_create(%s, %d, %p) failed\n",
 		    cls->name, dir, devinfo);
 		PCM_UNLOCK(d);
 		return (ENODEV);
 	}
 
 	err = pcm_chn_add(d, ch);
 	PCM_UNLOCK(d);
 	if (err) {
 		device_printf(d->dev, "pcm_chn_add(%s) failed, err=%d\n",
 		    ch->name, err);
 		pcm_chn_destroy(ch);
 	}
 
 	return (err);
 }
 
 static int
 pcm_killchan(device_t dev)
 {
 	struct snddev_info *d = device_get_softc(dev);
 	struct pcm_channel *ch;
 	int error;
 
 	PCM_BUSYASSERT(d);
 
 	ch = CHN_FIRST(d, channels.pcm);
 
 	PCM_LOCK(d);
 	error = pcm_chn_remove(d, ch);
 	PCM_UNLOCK(d);
 	if (error)
 		return (error);
 	return (pcm_chn_destroy(ch));
 }
 
 static int
 pcm_best_unit(int old)
 {
 	struct snddev_info *d;
 	int i, best, bestprio, prio;
 
 	best = -1;
 	bestprio = -100;
 	for (i = 0; pcm_devclass != NULL &&
 	    i < devclass_get_maxunit(pcm_devclass); i++) {
 		d = devclass_get_softc(pcm_devclass, i);
 		if (!PCM_REGISTERED(d))
 			continue;
 		prio = 0;
 		if (d->playcount == 0)
 			prio -= 10;
 		if (d->reccount == 0)
 			prio -= 2;
 		if (prio > bestprio || (prio == bestprio && i == old)) {
 			best = i;
 			bestprio = prio;
 		}
 	}
 	return (best);
 }
 
 int
 pcm_setstatus(device_t dev, char *str)
 {
 	struct snddev_info *d = device_get_softc(dev);
 
 	/* should only be called once */
 	if (d->flags & SD_F_REGISTERED)
 		return (EINVAL);
 
 	PCM_BUSYASSERT(d);
 
 	if (d->playcount == 0 || d->reccount == 0)
 		d->flags |= SD_F_SIMPLEX;
 
 	if (d->playcount > 0 || d->reccount > 0)
 		d->flags |= SD_F_AUTOVCHAN;
 
 	pcm_setmaxautovchans(d, snd_maxautovchans);
 
 	strlcpy(d->status, str, SND_STATUSLEN);
 
 	PCM_LOCK(d);
 
-	/* Last stage, enable cloning. */
-	if (d->clones != NULL)
-		(void)snd_clone_enable(d->clones);
-
 	/* Done, we're ready.. */
 	d->flags |= SD_F_REGISTERED;
 
 	PCM_RELEASE(d);
 
 	PCM_UNLOCK(d);
 
 	/*
 	 * Create all sysctls once SD_F_REGISTERED is set else
 	 * tunable sysctls won't work:
 	 */
 	pcm_sysinit(dev);
 
 	if (snd_unit_auto < 0)
 		snd_unit_auto = (snd_unit < 0) ? 1 : 0;
 	if (snd_unit < 0 || snd_unit_auto > 1)
 		snd_unit = device_get_unit(dev);
 	else if (snd_unit_auto == 1)
 		snd_unit = pcm_best_unit(snd_unit);
 
 	return (0);
 }
 
 uint32_t
 pcm_getflags(device_t dev)
 {
 	struct snddev_info *d = device_get_softc(dev);
 
 	return d->flags;
 }
 
 void
 pcm_setflags(device_t dev, uint32_t val)
 {
 	struct snddev_info *d = device_get_softc(dev);
 
 	d->flags = val;
 }
 
 void *
 pcm_getdevinfo(device_t dev)
 {
 	struct snddev_info *d = device_get_softc(dev);
 
 	return d->devinfo;
 }
 
 unsigned int
 pcm_getbuffersize(device_t dev, unsigned int minbufsz, unsigned int deflt, unsigned int maxbufsz)
 {
 	struct snddev_info *d = device_get_softc(dev);
 	int sz, x;
 
 	sz = 0;
 	if (resource_int_value(device_get_name(dev), device_get_unit(dev), "buffersize", &sz) == 0) {
 		x = sz;
 		RANGE(sz, minbufsz, maxbufsz);
 		if (x != sz)
 			device_printf(dev, "'buffersize=%d' hint is out of range (%d-%d), using %d\n", x, minbufsz, maxbufsz, sz);
 		x = minbufsz;
 		while (x < sz)
 			x <<= 1;
 		if (x > sz)
 			x >>= 1;
 		if (x != sz) {
 			device_printf(dev, "'buffersize=%d' hint is not a power of 2, using %d\n", sz, x);
 			sz = x;
 		}
 	} else {
 		sz = deflt;
 	}
 
 	d->bufsz = sz;
 
 	return sz;
 }
 
 static int
 sysctl_dev_pcm_bitperfect(SYSCTL_HANDLER_ARGS)
 {
 	struct snddev_info *d;
 	int err, val;
 
 	d = oidp->oid_arg1;
 	if (!PCM_REGISTERED(d))
 		return (ENODEV);
 
 	PCM_LOCK(d);
 	PCM_WAIT(d);
 	val = (d->flags & SD_F_BITPERFECT) ? 1 : 0;
 	PCM_ACQUIRE(d);
 	PCM_UNLOCK(d);
 
 	err = sysctl_handle_int(oidp, &val, 0, req);
 
 	if (err == 0 && req->newptr != NULL) {
 		if (!(val == 0 || val == 1)) {
 			PCM_RELEASE_QUICK(d);
 			return (EINVAL);
 		}
 
 		PCM_LOCK(d);
 
 		d->flags &= ~SD_F_BITPERFECT;
 		d->flags |= (val != 0) ? SD_F_BITPERFECT : 0;
 
 		PCM_RELEASE(d);
 		PCM_UNLOCK(d);
 	} else
 		PCM_RELEASE_QUICK(d);
 
 	return (err);
 }
 
-#ifdef SND_DEBUG
-static int
-sysctl_dev_pcm_clone_flags(SYSCTL_HANDLER_ARGS)
-{
-	struct snddev_info *d;
-	uint32_t flags;
-	int err;
-
-	d = oidp->oid_arg1;
-	if (!PCM_REGISTERED(d) || d->clones == NULL)
-		return (ENODEV);
-
-	PCM_ACQUIRE_QUICK(d);
-
-	flags = snd_clone_getflags(d->clones);
-	err = sysctl_handle_int(oidp, &flags, 0, req);
-
-	if (err == 0 && req->newptr != NULL) {
-		if (flags & ~SND_CLONE_MASK)
-			err = EINVAL;
-		else
-			(void)snd_clone_setflags(d->clones, flags);
-	}
-
-	PCM_RELEASE_QUICK(d);
-
-	return (err);
-}
-
-static int
-sysctl_dev_pcm_clone_deadline(SYSCTL_HANDLER_ARGS)
-{
-	struct snddev_info *d;
-	int err, deadline;
-
-	d = oidp->oid_arg1;
-	if (!PCM_REGISTERED(d) || d->clones == NULL)
-		return (ENODEV);
-
-	PCM_ACQUIRE_QUICK(d);
-
-	deadline = snd_clone_getdeadline(d->clones);
-	err = sysctl_handle_int(oidp, &deadline, 0, req);
-
-	if (err == 0 && req->newptr != NULL) {
-		if (deadline < 0)
-			err = EINVAL;
-		else
-			(void)snd_clone_setdeadline(d->clones, deadline);
-	}
-
-	PCM_RELEASE_QUICK(d);
-
-	return (err);
-}
-
-static int
-sysctl_dev_pcm_clone_gc(SYSCTL_HANDLER_ARGS)
-{
-	struct snddev_info *d;
-	int err, val;
-
-	d = oidp->oid_arg1;
-	if (!PCM_REGISTERED(d) || d->clones == NULL)
-		return (ENODEV);
-
-	val = 0;
-	err = sysctl_handle_int(oidp, &val, 0, req);
-
-	if (err == 0 && req->newptr != NULL && val != 0) {
-		PCM_ACQUIRE_QUICK(d);
-		val = snd_clone_gc(d->clones);
-		PCM_RELEASE_QUICK(d);
-		if (bootverbose != 0 || snd_verbose > 3)
-			device_printf(d->dev, "clone gc: pruned=%d\n", val);
-	}
-
-	return (err);
-}
-
-static int
-sysctl_hw_snd_clone_gc(SYSCTL_HANDLER_ARGS)
-{
-	struct snddev_info *d;
-	int i, err, val;
-
-	val = 0;
-	err = sysctl_handle_int(oidp, &val, 0, req);
-
-	if (err == 0 && req->newptr != NULL && val != 0) {
-		for (i = 0; pcm_devclass != NULL &&
-		    i < devclass_get_maxunit(pcm_devclass); i++) {
-			d = devclass_get_softc(pcm_devclass, i);
-			if (!PCM_REGISTERED(d) || d->clones == NULL)
-				continue;
-			PCM_ACQUIRE_QUICK(d);
-			val = snd_clone_gc(d->clones);
-			PCM_RELEASE_QUICK(d);
-			if (bootverbose != 0 || snd_verbose > 3)
-				device_printf(d->dev, "clone gc: pruned=%d\n",
-				    val);
-		}
-	}
-
-	return (err);
-}
-SYSCTL_PROC(_hw_snd, OID_AUTO, clone_gc,
-    CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_NEEDGIANT, 0, sizeof(int),
-    sysctl_hw_snd_clone_gc, "I",
-    "global clone garbage collector");
-#endif
-
 static u_int8_t
 pcm_mode_init(struct snddev_info *d)
 {
 	u_int8_t mode = 0;
 
 	if (d->playcount > 0)
 		mode |= PCM_MODE_PLAY;
 	if (d->reccount > 0)
 		mode |= PCM_MODE_REC;
 	if (d->mixer_dev != NULL)
 		mode |= PCM_MODE_MIXER;
 
 	return (mode);
 }
 
 static void
 pcm_sysinit(device_t dev)
 {
   	struct snddev_info *d = device_get_softc(dev);
 	u_int8_t mode;
 
 	mode = pcm_mode_init(d);
 
 	/* XXX: a user should be able to set this with a control tool, the
 	   sysadmin then needs min+max sysctls for this */
 	SYSCTL_ADD_UINT(device_get_sysctl_ctx(dev),
 	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
             OID_AUTO, "buffersize", CTLFLAG_RD, &d->bufsz, 0, "allocated buffer size");
 	SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
 	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO,
 	    "bitperfect", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, d,
 	    sizeof(d), sysctl_dev_pcm_bitperfect, "I",
 	    "bit-perfect playback/recording (0=disable, 1=enable)");
 	SYSCTL_ADD_UINT(device_get_sysctl_ctx(dev),
 	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
 	    OID_AUTO, "mode", CTLFLAG_RD, NULL, mode,
 	    "mode (1=mixer, 2=play, 4=rec. The values are OR'ed if more than one"
 	    "mode is supported)");
-#ifdef SND_DEBUG
-	SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
-	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO,
-	    "clone_flags", CTLTYPE_UINT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,
-	    d, sizeof(d), sysctl_dev_pcm_clone_flags, "IU",
-	    "clone flags");
-	SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
-	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO,
-	    "clone_deadline", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,
-	    d, sizeof(d), sysctl_dev_pcm_clone_deadline, "I",
-	    "clone expiration deadline (ms)");
-	SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
-	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO,
-	    "clone_gc",
-	    CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, d, sizeof(d),
-	    sysctl_dev_pcm_clone_gc, "I", "clone garbage collector");
-#endif
 	if (d->flags & SD_F_AUTOVCHAN)
 		vchan_initsys(dev);
 	if (d->flags & SD_F_EQ)
 		feeder_eq_initsys(dev);
 }
 
 int
 pcm_register(device_t dev, void *devinfo, int numplay, int numrec)
 {
 	struct snddev_info *d;
 	int i;
 
 	if (pcm_veto_load) {
 		device_printf(dev, "disabled due to an error while initialising: %d\n", pcm_veto_load);
 
 		return EINVAL;
 	}
 
 	if (device_get_unit(dev) > PCMMAXUNIT) {
 		device_printf(dev, "PCMMAXUNIT reached : unit=%d > %d\n",
 		    device_get_unit(dev), PCMMAXUNIT);
 		device_printf(dev,
 		    "Use 'hw.snd.maxunit' tunable to raise the limit.\n");
 		return ENODEV;
 	}
 
 	d = device_get_softc(dev);
 	d->dev = dev;
 	d->lock = snd_mtxcreate(device_get_nameunit(dev), "sound cdev");
 	cv_init(&d->cv, device_get_nameunit(dev));
 	PCM_ACQUIRE_QUICK(d);
-	dsp_cdevinfo_init(d);
 #if 0
 	/*
 	 * d->flags should be cleared by the allocator of the softc.
 	 * We cannot clear this field here because several devices set
 	 * this flag before calling pcm_register().
 	 */
 	d->flags = 0;
 #endif
 	i = 0;
 	if (resource_int_value(device_get_name(dev), device_get_unit(dev),
 	    "vpc", &i) != 0 || i != 0)
 		d->flags |= SD_F_VPC;
 
 	if (resource_int_value(device_get_name(dev), device_get_unit(dev),
 	    "bitperfect", &i) == 0 && i != 0)
 		d->flags |= SD_F_BITPERFECT;
 
 	d->devinfo = devinfo;
 	d->devcount = 0;
 	d->reccount = 0;
 	d->playcount = 0;
 	d->pvchancount = 0;
 	d->rvchancount = 0;
 	d->pvchanrate = 0;
 	d->pvchanformat = 0;
 	d->rvchanrate = 0;
 	d->rvchanformat = 0;
 
-	/*
-	 * Create clone manager, disabled by default. Cloning will be
-	 * enabled during final stage of driver initialization through
-	 * pcm_setstatus().
-	 */
-	d->clones = snd_clone_create(SND_U_MASK | SND_D_MASK, PCMMAXCLONE,
-	    SND_CLONE_DEADLINE_DEFAULT, SND_CLONE_WAITOK |
-	    SND_CLONE_GC_ENABLE | SND_CLONE_GC_UNREF |
-	    SND_CLONE_GC_LASTREF | SND_CLONE_GC_EXPIRED);
-
 	CHN_INIT(d, channels.pcm);
 	CHN_INIT(d, channels.pcm.busy);
 	CHN_INIT(d, channels.pcm.opened);
 
 	/* XXX This is incorrect, but lets play along for now. */
 	if ((numplay == 0 || numrec == 0) && numplay != numrec)
 		d->flags |= SD_F_SIMPLEX;
 
 	sysctl_ctx_init(&d->play_sysctl_ctx);
 	d->play_sysctl_tree = SYSCTL_ADD_NODE(&d->play_sysctl_ctx,
 	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, "play",
 	    CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "playback channels node");
 	sysctl_ctx_init(&d->rec_sysctl_ctx);
 	d->rec_sysctl_tree = SYSCTL_ADD_NODE(&d->rec_sysctl_ctx,
 	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, "rec",
 	    CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "recording channels node");
 
 	if (numplay > 0 || numrec > 0)
 		d->flags |= SD_F_AUTOVCHAN;
 
 	sndstat_register(dev, d->status, sndstat_prepare_pcm);
 
-	return 0;
+	return (dsp_make_dev(dev));
 }
 
 int
 pcm_unregister(device_t dev)
 {
 	struct snddev_info *d;
 	struct pcm_channel *ch;
 
 	d = device_get_softc(dev);
 
 	if (!PCM_ALIVE(d)) {
 		device_printf(dev, "unregister: device not configured\n");
 		return (0);
 	}
 
 	PCM_LOCK(d);
 	PCM_WAIT(d);
 
 	d->flags |= SD_F_DETACHING;
 
 	PCM_ACQUIRE(d);
 	PCM_UNLOCK(d);
 
 	CHN_FOREACH(ch, d, channels.pcm) {
 		CHN_LOCK(ch);
 		if (ch->refcount > 0) {
 			device_printf(dev,
 			    "unregister: channel %s busy (pid %d)\n",
 			    ch->name, ch->pid);
 			CHN_UNLOCK(ch);
 			PCM_RELEASE_QUICK(d);
 			return (EBUSY);
 		}
 		CHN_UNLOCK(ch);
 	}
 
-	if (d->clones != NULL) {
-		if (snd_clone_busy(d->clones) != 0) {
-			device_printf(dev, "unregister: clone busy\n");
-			PCM_RELEASE_QUICK(d);
-			return (EBUSY);
-		} else {
-			PCM_LOCK(d);
-			(void)snd_clone_disable(d->clones);
-			PCM_UNLOCK(d);
-		}
-	}
+	dsp_destroy_dev(dev);
 
 	if (mixer_uninit(dev) == EBUSY) {
 		device_printf(dev, "unregister: mixer busy\n");
 		PCM_LOCK(d);
-		if (d->clones != NULL)
-			(void)snd_clone_enable(d->clones);
 		PCM_RELEASE(d);
 		PCM_UNLOCK(d);
 		return (EBUSY);
 	}
 
 	/* remove /dev/sndstat entry first */
 	sndstat_unregister(dev);
 
 	PCM_LOCK(d);
 	d->flags |= SD_F_DYING;
 	d->flags &= ~SD_F_REGISTERED;
 	PCM_UNLOCK(d);
 
-	/*
-	 * No lock being held, so this thing can be flushed without
-	 * stucking into devdrn oblivion.
-	 */
-	if (d->clones != NULL) {
-		snd_clone_destroy(d->clones);
-		d->clones = NULL;
-	}
-
 	if (d->play_sysctl_tree != NULL) {
 		sysctl_ctx_free(&d->play_sysctl_ctx);
 		d->play_sysctl_tree = NULL;
 	}
 	if (d->rec_sysctl_tree != NULL) {
 		sysctl_ctx_free(&d->rec_sysctl_ctx);
 		d->rec_sysctl_tree = NULL;
 	}
 
 	while (!CHN_EMPTY(d, channels.pcm))
 		pcm_killchan(dev);
 
-	dsp_cdevinfo_flush(d);
-
 	PCM_LOCK(d);
 	PCM_RELEASE(d);
 	cv_destroy(&d->cv);
 	PCM_UNLOCK(d);
 	snd_mtxfree(d->lock);
 
 	if (snd_unit == device_get_unit(dev)) {
 		snd_unit = pcm_best_unit(-1);
 		if (snd_unit_auto == 0)
 			snd_unit_auto = 1;
 	}
 
 	return (0);
 }
 
 /************************************************************************/
 
 /**
  * @brief	Handle OSSv4 SNDCTL_SYSINFO ioctl.
  *
  * @param si	Pointer to oss_sysinfo struct where information about the
  * 		sound subsystem will be written/copied.
  *
  * This routine returns information about the sound system, such as the
  * current OSS version, number of audio, MIDI, and mixer drivers, etc.
  * Also includes a bitmask showing which of the above types of devices
  * are open (busy).
  *
  * @note
  * Calling threads must not hold any snddev_info or pcm_channel locks.
  *
  * @author	Ryan Beasley <ryanb@FreeBSD.org>
  */
 void
 sound_oss_sysinfo(oss_sysinfo *si)
 {
 	static char si_product[] = "FreeBSD native OSS ABI";
 	static char si_version[] = __XSTRING(__FreeBSD_version);
 	static char si_license[] = "BSD";
 	static int intnbits = sizeof(int) * 8;	/* Better suited as macro?
 						   Must pester a C guru. */
 
 	struct snddev_info *d;
 	struct pcm_channel *c;
 	int i, j, ncards;
 
 	ncards = 0;
 
 	strlcpy(si->product, si_product, sizeof(si->product));
 	strlcpy(si->version, si_version, sizeof(si->version));
 	si->versionnum = SOUND_VERSION;
 	strlcpy(si->license, si_license, sizeof(si->license));
 
 	/*
 	 * Iterate over PCM devices and their channels, gathering up data
 	 * for the numaudios, ncards, and openedaudio fields.
 	 */
 	si->numaudios = 0;
 	bzero((void *)&si->openedaudio, sizeof(si->openedaudio));
 
 	j = 0;
 
 	for (i = 0; pcm_devclass != NULL &&
 	    i < devclass_get_maxunit(pcm_devclass); i++) {
 		d = devclass_get_softc(pcm_devclass, i);
 		if (!PCM_REGISTERED(d))
 			continue;
 
 		/* XXX Need Giant magic entry ??? */
 
 		/* See note in function's docblock */
 		PCM_UNLOCKASSERT(d);
 		PCM_LOCK(d);
 
 		si->numaudios += d->devcount;
 		++ncards;
 
 		CHN_FOREACH(c, d, channels.pcm) {
 			CHN_UNLOCKASSERT(c);
 			CHN_LOCK(c);
 			if (c->flags & CHN_F_BUSY)
 				si->openedaudio[j / intnbits] |=
 				    (1 << (j % intnbits));
 			CHN_UNLOCK(c);
 			j++;
 		}
 
 		PCM_UNLOCK(d);
 	}
 	si->numaudioengines = si->numaudios;
 
 	si->numsynths = 0;	/* OSSv4 docs:  this field is obsolete */
 	/**
 	 * @todo	Collect num{midis,timers}.
 	 *
 	 * Need access to sound/midi/midi.c::midistat_lock in order
 	 * to safely touch midi_devices and get a head count of, well,
 	 * MIDI devices.  midistat_lock is a global static (i.e., local to
 	 * midi.c), but midi_devices is a regular global; should the mutex
 	 * be publicized, or is there another way to get this information?
 	 *
 	 * NB:	MIDI/sequencer stuff is currently on hold.
 	 */
 	si->nummidis = 0;
 	si->numtimers = 0;
 	si->nummixers = mixer_count;
 	si->numcards = ncards;
 		/* OSSv4 docs:	Intended only for test apps; API doesn't
 		   really have much of a concept of cards.  Shouldn't be
 		   used by applications. */
 
 	/**
 	 * @todo	Fill in "busy devices" fields.
 	 *
 	 *  si->openedmidi = " MIDI devices
 	 */
 	bzero((void *)&si->openedmidi, sizeof(si->openedmidi));
 
 	/*
 	 * Si->filler is a reserved array, but according to docs each
 	 * element should be set to -1.
 	 */
 	for (i = 0; i < sizeof(si->filler)/sizeof(si->filler[0]); i++)
 		si->filler[i] = -1;
 }
 
 int
 sound_oss_card_info(oss_card_info *si)
 {
 	struct snddev_info *d;
 	int i, ncards;
 
 	ncards = 0;
 
 	for (i = 0; pcm_devclass != NULL &&
 	    i < devclass_get_maxunit(pcm_devclass); i++) {
 		d = devclass_get_softc(pcm_devclass, i);
 		if (!PCM_REGISTERED(d))
 			continue;
 
 		if (ncards++ != si->card)
 			continue;
 
 		PCM_UNLOCKASSERT(d);
 		PCM_LOCK(d);
 		
 		strlcpy(si->shortname, device_get_nameunit(d->dev),
 		    sizeof(si->shortname));
 		strlcpy(si->longname, device_get_desc(d->dev),
 		    sizeof(si->longname));
 		strlcpy(si->hw_info, d->status, sizeof(si->hw_info));
 		si->intr_count = si->ack_count = 0;
 
 		PCM_UNLOCK(d);
 
 		return (0);
 	}
 	return (ENXIO);
 }
 
 /************************************************************************/
 
 static int
 sound_modevent(module_t mod, int type, void *data)
 {
 	int ret;
 
 	ret = 0;
 	switch (type) {
 		case MOD_LOAD:
 			pcm_devclass = devclass_create("pcm");
 			pcmsg_unrhdr = new_unrhdr(1, INT_MAX, NULL);
 			break;
 		case MOD_UNLOAD:
 			if (pcmsg_unrhdr != NULL) {
 				delete_unrhdr(pcmsg_unrhdr);
 				pcmsg_unrhdr = NULL;
 			}
 			break;
 		case MOD_SHUTDOWN:
 			break;
 		default:
 			ret = ENOTSUP;
 	}
 
 	return ret;
 }
 
 DEV_MODULE(sound, sound_modevent, NULL);
 MODULE_VERSION(sound, SOUND_MODVER);
diff --git a/sys/dev/sound/pcm/sound.h b/sys/dev/sound/pcm/sound.h
index 51d1624b2d7e..d95e3a29521c 100644
--- a/sys/dev/sound/pcm/sound.h
+++ b/sys/dev/sound/pcm/sound.h
@@ -1,598 +1,594 @@
 /*-
  * SPDX-License-Identifier: BSD-2-Clause
  *
  * Copyright (c) 2005-2009 Ariff Abdullah <ariff@FreeBSD.org>
  * Copyright (c) 1999 Cameron Grant <cg@FreeBSD.org>
  * Copyright (c) 1995 Hannu Savolainen
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
 
 /*
  * first, include kernel header files.
  */
 
 #ifndef _OS_H_
 #define _OS_H_
 
 #ifdef _KERNEL
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/eventhandler.h>
 #include <sys/ioccom.h>
 #include <sys/filio.h>
 #include <sys/sockio.h>
 #include <sys/fcntl.h>
 #include <sys/selinfo.h>
 #include <sys/proc.h>
 #include <sys/kernel.h> /* for DATA_SET */
 #include <sys/module.h>
 #include <sys/conf.h>
 #include <sys/file.h>
 #include <sys/uio.h>
 #include <sys/syslog.h>
 #include <sys/errno.h>
 #include <sys/malloc.h>
 #include <sys/bus.h>
 #include <machine/resource.h>
 #include <machine/bus.h>
 #include <sys/rman.h>
 #include <sys/limits.h>
 #include <sys/mman.h>
 #include <sys/poll.h>
 #include <sys/sbuf.h>
 #include <sys/soundcard.h>
 #include <sys/sndstat.h>
 #include <sys/sysctl.h>
 #include <sys/kobj.h>
 #include <vm/vm.h>
 #include <vm/pmap.h>
 
 #include <sys/lock.h>
 #include <sys/mutex.h>
 #include <sys/condvar.h>
 
 #ifndef KOBJMETHOD_END
 #define KOBJMETHOD_END	{ NULL, NULL }
 #endif
 
 struct pcm_channel;
 struct pcm_feeder;
 struct snd_dbuf;
 struct snd_mixer;
 
 #include <dev/sound/pcm/buffer.h>
 #include <dev/sound/pcm/matrix.h>
 #include <dev/sound/pcm/matrix_map.h>
 #include <dev/sound/pcm/channel.h>
 #include <dev/sound/pcm/feeder.h>
 #include <dev/sound/pcm/mixer.h>
 #include <dev/sound/pcm/dsp.h>
-#include <dev/sound/clone.h>
 #include <dev/sound/unit.h>
 
 #define	PCM_SOFTC_SIZE	(sizeof(struct snddev_info))
 
 #define SND_STATUSLEN	64
 
 #define SOUND_MODVER	5
 
 #define SOUND_MINVER	SOUND_MODVER
 #define SOUND_PREFVER	SOUND_MODVER
 #define SOUND_MAXVER	SOUND_MODVER
 
 /*
  * We're abusing the fact that MAXMINOR still have enough room
  * for our bit twiddling and nobody ever need 512 unique soundcards,
  * 32 unique device types and 1024 unique cloneable devices for the
  * next 100 years...
  */
 
 #define PCMMAXUNIT		(snd_max_u())
 #define PCMMAXDEV		(snd_max_d())
 #define PCMMAXCHAN		(snd_max_c())
 
-#define PCMMAXCLONE		PCMMAXCHAN
-
 #define PCMUNIT(x)		(snd_unit2u(dev2unit(x)))
 #define PCMDEV(x)		(snd_unit2d(dev2unit(x)))
 #define PCMCHAN(x)		(snd_unit2c(dev2unit(x)))
 
 /* XXX unit2minor compat */
 #define PCMMINOR(x)	(x)
 
 /*
  * By design, limit possible channels for each direction.
  */
 #define SND_MAXHWCHAN		256
 #define SND_MAXVCHANS		SND_MAXHWCHAN
 
 #define SD_F_SIMPLEX		0x00000001
 #define SD_F_AUTOVCHAN		0x00000002
 #define SD_F_SOFTPCMVOL		0x00000004
 #define SD_F_DYING		0x00000008
 #define SD_F_DETACHING		0x00000010
 #define SD_F_BUSY		0x00000020
 #define SD_F_MPSAFE		0x00000040
 #define SD_F_REGISTERED		0x00000080
 #define SD_F_BITPERFECT		0x00000100
 #define SD_F_VPC		0x00000200	/* volume-per-channel */
 #define SD_F_EQ			0x00000400	/* EQ */
 #define SD_F_EQ_ENABLED		0x00000800	/* EQ enabled */
 #define SD_F_EQ_BYPASSED	0x00001000	/* EQ bypassed */
 #define SD_F_EQ_PC		0x00002000	/* EQ per-channel */
 
 #define SD_F_EQ_DEFAULT		(SD_F_EQ | SD_F_EQ_ENABLED)
 #define SD_F_EQ_MASK		(SD_F_EQ | SD_F_EQ_ENABLED |		\
 				 SD_F_EQ_BYPASSED | SD_F_EQ_PC)
 
 #define SD_F_PRIO_RD		0x10000000
 #define SD_F_PRIO_WR		0x20000000
 #define SD_F_PRIO_SET		(SD_F_PRIO_RD | SD_F_PRIO_WR)
 #define SD_F_DIR_SET		0x40000000
 #define SD_F_TRANSIENT		0xf0000000
 
 #define SD_F_BITS		"\020"					\
 				"\001SIMPLEX"				\
 				"\002AUTOVCHAN"				\
 				"\003SOFTPCMVOL"			\
 				"\004DYING"				\
 				"\005DETACHING"				\
 				"\006BUSY"				\
 				"\007MPSAFE"				\
 				"\010REGISTERED"			\
 				"\011BITPERFECT"			\
 				"\012VPC"				\
 				"\013EQ"				\
 				"\014EQ_ENABLED"			\
 				"\015EQ_BYPASSED"			\
 				"\016EQ_PC"				\
 				"\035PRIO_RD"				\
 				"\036PRIO_WR"				\
 				"\037DIR_SET"
 
 #define PCM_ALIVE(x)		((x) != NULL && (x)->lock != NULL &&	\
 				 !((x)->flags & SD_F_DYING))
 #define PCM_REGISTERED(x)	(PCM_ALIVE(x) &&			\
 				 ((x)->flags & SD_F_REGISTERED))
 
 #define	PCM_DETACHING(x)	((x)->flags & SD_F_DETACHING)
 
 /* many variables should be reduced to a range. Here define a macro */
 #define RANGE(var, low, high) (var) = \
 	(((var)<(low))? (low) : ((var)>(high))? (high) : (var))
 #define DSP_BUFFSIZE (8192)
 
 /* make figuring out what a format is easier. got AFMT_STEREO already */
 #define AFMT_32BIT (AFMT_S32_LE | AFMT_S32_BE | AFMT_U32_LE | AFMT_U32_BE)
 #define AFMT_24BIT (AFMT_S24_LE | AFMT_S24_BE | AFMT_U24_LE | AFMT_U24_BE)
 #define AFMT_16BIT (AFMT_S16_LE | AFMT_S16_BE | AFMT_U16_LE | AFMT_U16_BE)
 #define AFMT_G711  (AFMT_MU_LAW | AFMT_A_LAW)
 #define AFMT_8BIT (AFMT_G711 | AFMT_U8 | AFMT_S8)
 #define AFMT_SIGNED (AFMT_S32_LE | AFMT_S32_BE | AFMT_S24_LE | AFMT_S24_BE | \
 			AFMT_S16_LE | AFMT_S16_BE | AFMT_S8)
 #define AFMT_BIGENDIAN (AFMT_S32_BE | AFMT_U32_BE | AFMT_S24_BE | AFMT_U24_BE | \
 			AFMT_S16_BE | AFMT_U16_BE)
 
 #define AFMT_CONVERTIBLE	(AFMT_8BIT | AFMT_16BIT | AFMT_24BIT |	\
 				 AFMT_32BIT)
 
 /* Supported vchan mixing formats */
 #define AFMT_VCHAN		(AFMT_CONVERTIBLE & ~AFMT_G711)
 
 #define AFMT_PASSTHROUGH		AFMT_AC3
 #define AFMT_PASSTHROUGH_RATE		48000
 #define AFMT_PASSTHROUGH_CHANNEL	2
 #define AFMT_PASSTHROUGH_EXTCHANNEL	0
 
 /*
  * We're simply using unused, contiguous bits from various AFMT_ definitions.
  * ~(0xb00ff7ff)
  */
 #define AFMT_ENCODING_MASK	0xf00fffff
 #define AFMT_CHANNEL_MASK	0x07f00000
 #define AFMT_CHANNEL_SHIFT	20
 #define AFMT_CHANNEL_MAX	0x7f
 #define AFMT_EXTCHANNEL_MASK	0x08000000
 #define AFMT_EXTCHANNEL_SHIFT	27
 #define AFMT_EXTCHANNEL_MAX	1
 
 #define AFMT_ENCODING(v)	((v) & AFMT_ENCODING_MASK)
 
 #define AFMT_EXTCHANNEL(v)	(((v) & AFMT_EXTCHANNEL_MASK) >>	\
 				AFMT_EXTCHANNEL_SHIFT)
 
 #define AFMT_CHANNEL(v)		(((v) & AFMT_CHANNEL_MASK) >>		\
 				AFMT_CHANNEL_SHIFT)
 
 #define AFMT_BIT(v)		(((v) & AFMT_32BIT) ? 32 :		\
 				(((v) & AFMT_24BIT) ? 24 :		\
 				((((v) & AFMT_16BIT) ||			\
 				((v) & AFMT_PASSTHROUGH)) ? 16 : 8)))
 
 #define AFMT_BPS(v)		(AFMT_BIT(v) >> 3)
 #define AFMT_ALIGN(v)		(AFMT_BPS(v) * AFMT_CHANNEL(v))
 
 #define SND_FORMAT(f, c, e)	(AFMT_ENCODING(f) |		\
 				(((c) << AFMT_CHANNEL_SHIFT) &		\
 				AFMT_CHANNEL_MASK) |			\
 				(((e) << AFMT_EXTCHANNEL_SHIFT) &	\
 				AFMT_EXTCHANNEL_MASK))
 
 #define AFMT_U8_NE	AFMT_U8
 #define AFMT_S8_NE	AFMT_S8
 
 #define AFMT_SIGNED_NE	(AFMT_S8_NE | AFMT_S16_NE | AFMT_S24_NE | AFMT_S32_NE)
 
 #define AFMT_NE		(AFMT_SIGNED_NE | AFMT_U8_NE | AFMT_U16_NE |	\
 			 AFMT_U24_NE | AFMT_U32_NE)
 
 /*
  * Minor numbers for the sound driver.
  *
  * Unfortunately Creative called the codec chip of SB as a DSP. For this
  * reason the /dev/dsp is reserved for digitized audio use. There is a
  * device for true DSP processors but it will be called something else.
  * In v3.0 it's /dev/sndproc but this could be a temporary solution.
  */
 
 #define SND_DEV_CTL	0	/* Control port /dev/mixer */
 #define SND_DEV_SEQ	1	/* Sequencer /dev/sequencer */
 #define SND_DEV_MIDIN	2	/* Raw midi access */
 #define SND_DEV_DSP	3	/* Digitized voice /dev/dsp */
 #define SND_DEV_AUDIO	4	/* Sparc compatible /dev/audio */
 #define SND_DEV_DSP16	5	/* Like /dev/dsp but 16 bits/sample */
 #define SND_DEV_STATUS	6	/* /dev/sndstat */
 				/* #7 not in use now. */
 #define SND_DEV_SEQ2	8	/* /dev/sequencer, level 2 interface */
 #define SND_DEV_SNDPROC 9	/* /dev/sndproc for programmable devices */
 #define SND_DEV_PSS	SND_DEV_SNDPROC /* ? */
 #define SND_DEV_NORESET	10
 
 #define SND_DEV_DSPHW_PLAY	11	/* specific playback channel */
 #define SND_DEV_DSPHW_VPLAY	12	/* specific virtual playback channel */
 #define SND_DEV_DSPHW_REC	13	/* specific record channel */
 #define SND_DEV_DSPHW_VREC	14	/* specific virtual record channel */
 
 #define SND_DEV_DSPHW_CD	15	/* s16le/stereo 44100Hz CD */
 
 /* 
  * OSSv4 compatible device. For now, it serve no purpose and
  * the cloning itself will forward the request to ordinary /dev/dsp
  * instead.
  */
 #define SND_DEV_DSP_MMAP	16	/* /dev/dsp_mmap     */
 #define SND_DEV_DSP_AC3		17	/* /dev/dsp_ac3      */
 #define SND_DEV_DSP_MULTICH	18	/* /dev/dsp_multich  */
 #define SND_DEV_DSP_SPDIFOUT	19	/* /dev/dsp_spdifout */
 #define SND_DEV_DSP_SPDIFIN	20	/* /dev/dsp_spdifin  */
 
 #define DSP_DEFAULT_SPEED	8000
 
 #define ON		1
 #define OFF		0
 
 extern int pcm_veto_load;
 extern int snd_unit;
 extern int snd_maxautovchans;
 extern int snd_verbose;
 extern devclass_t pcm_devclass;
 extern struct unrhdr *pcmsg_unrhdr;
 
 /*
  * some macros for debugging purposes
  * DDB/DEB to enable/disable debugging stuff
  * BVDDB   to enable debugging when bootverbose
  */
 #define BVDDB(x) if (bootverbose) x
 
 #ifndef DEB
 #define DEB(x)
 #endif
 
 SYSCTL_DECL(_hw_snd);
 
 int pcm_setvchans(struct snddev_info *d, int direction, int newcnt, int num);
 int pcm_chnalloc(struct snddev_info *d, struct pcm_channel **ch, int direction,
     pid_t pid, char *comm, int devunit);
 int pcm_chnrelease(struct pcm_channel *c);
 int pcm_chnref(struct pcm_channel *c, int ref);
 
 struct pcm_channel *pcm_chn_create(struct snddev_info *d, struct pcm_channel *parent, kobj_class_t cls, int dir, int num, void *devinfo);
 int pcm_chn_destroy(struct pcm_channel *ch);
 int pcm_chn_add(struct snddev_info *d, struct pcm_channel *ch);
 int pcm_chn_remove(struct snddev_info *d, struct pcm_channel *ch);
 
 int pcm_addchan(device_t dev, int dir, kobj_class_t cls, void *devinfo);
 unsigned int pcm_getbuffersize(device_t dev, unsigned int minbufsz, unsigned int deflt, unsigned int maxbufsz);
 int pcm_register(device_t dev, void *devinfo, int numplay, int numrec);
 int pcm_unregister(device_t dev);
 int pcm_setstatus(device_t dev, char *str);
 u_int32_t pcm_getflags(device_t dev);
 void pcm_setflags(device_t dev, u_int32_t val);
 void *pcm_getdevinfo(device_t dev);
 
 int snd_setup_intr(device_t dev, struct resource *res, int flags,
 		   driver_intr_t hand, void *param, void **cookiep);
 
 void *snd_mtxcreate(const char *desc, const char *type);
 void snd_mtxfree(void *m);
 void snd_mtxassert(void *m);
 #define	snd_mtxlock(m) mtx_lock(m)
 #define	snd_mtxunlock(m) mtx_unlock(m)
 
 typedef int (*sndstat_handler)(struct sbuf *s, device_t dev, int verbose);
 int sndstat_register(device_t dev, char *str, sndstat_handler handler);
 int sndstat_unregister(device_t dev);
 
 /* usage of flags in device config entry (config file) */
 #define DV_F_DRQ_MASK	0x00000007	/* mask for secondary drq */
 #define	DV_F_DUAL_DMA	0x00000010	/* set to use secondary dma channel */
 
 /* ought to be made obsolete but still used by mss */
 #define	DV_F_DEV_MASK	0x0000ff00	/* force device type/class */
 #define	DV_F_DEV_SHIFT	8		/* force device type/class */
 
 /*
  * this is rather kludgey- we need to duplicate these struct def'ns from sound.c
  * so that the macro versions of pcm_{,un}lock can dereference them.
  * we also have to do this now makedev() has gone away.
  */
 
 struct snddev_info {
 	struct {
 		struct {
 			SLIST_HEAD(, pcm_channel) head;
 			struct {
 				SLIST_HEAD(, pcm_channel) head;
 			} busy;
 			struct {
 				SLIST_HEAD(, pcm_channel) head;
 			} opened;
 		} pcm;
 	} channels;
-	TAILQ_HEAD(dsp_cdevinfo_linkhead, dsp_cdevinfo) dsp_cdevinfo_pool;
-	struct snd_clone *clones;
 	unsigned devcount, playcount, reccount, pvchancount, rvchancount ;
 	unsigned flags;
 	unsigned int bufsz;
 	void *devinfo;
 	device_t dev;
 	char status[SND_STATUSLEN];
 	struct mtx *lock;
 	struct cdev *mixer_dev;
+	struct cdev *dsp_dev;
 	uint32_t pvchanrate, pvchanformat;
 	uint32_t rvchanrate, rvchanformat;
 	int32_t eqpreamp;
 	struct sysctl_ctx_list play_sysctl_ctx, rec_sysctl_ctx;
 	struct sysctl_oid *play_sysctl_tree, *rec_sysctl_tree;
 	struct cv cv;
 };
 
 void	sound_oss_sysinfo(oss_sysinfo *);
 int	sound_oss_card_info(oss_card_info *);
 
 #define	PCM_MODE_MIXER		0x01
 #define	PCM_MODE_PLAY		0x02
 #define	PCM_MODE_REC		0x04
 
 #define PCM_LOCKOWNED(d)	mtx_owned((d)->lock)
 #define	PCM_LOCK(d)		mtx_lock((d)->lock)
 #define	PCM_UNLOCK(d)		mtx_unlock((d)->lock)
 #define PCM_TRYLOCK(d)		mtx_trylock((d)->lock)
 #define PCM_LOCKASSERT(d)	mtx_assert((d)->lock, MA_OWNED)
 #define PCM_UNLOCKASSERT(d)	mtx_assert((d)->lock, MA_NOTOWNED)
 
 /*
  * For PCM_[WAIT | ACQUIRE | RELEASE], be sure to surround these
  * with PCM_LOCK/UNLOCK() sequence, or I'll come to gnaw upon you!
  */
 #ifdef SND_DIAGNOSTIC
 #define PCM_WAIT(x)		do {					\
 	if (!PCM_LOCKOWNED(x))						\
 		panic("%s(%d): [PCM WAIT] Mutex not owned!",		\
 		    __func__, __LINE__);				\
 	while ((x)->flags & SD_F_BUSY) {				\
 		if (snd_verbose > 3)					\
 			device_printf((x)->dev,				\
 			    "%s(%d): [PCM WAIT] calling cv_wait().\n",	\
 			    __func__, __LINE__);			\
 		cv_wait(&(x)->cv, (x)->lock);				\
 	}								\
 } while (0)
 
 #define PCM_ACQUIRE(x)		do {					\
 	if (!PCM_LOCKOWNED(x))						\
 		panic("%s(%d): [PCM ACQUIRE] Mutex not owned!",		\
 		    __func__, __LINE__);				\
 	if ((x)->flags & SD_F_BUSY)					\
 		panic("%s(%d): [PCM ACQUIRE] "				\
 		    "Trying to acquire BUSY cv!", __func__, __LINE__);	\
 	(x)->flags |= SD_F_BUSY;					\
 } while (0)
 
 #define PCM_RELEASE(x)		do {					\
 	if (!PCM_LOCKOWNED(x))						\
 		panic("%s(%d): [PCM RELEASE] Mutex not owned!",		\
 		    __func__, __LINE__);				\
 	if ((x)->flags & SD_F_BUSY) {					\
 		(x)->flags &= ~SD_F_BUSY;				\
 		if ((x)->cv.cv_waiters != 0) {				\
 			if ((x)->cv.cv_waiters > 1 && snd_verbose > 3)	\
 				device_printf((x)->dev,			\
 				    "%s(%d): [PCM RELEASE] "		\
 				    "cv_waiters=%d > 1!\n",		\
 				    __func__, __LINE__,			\
 				    (x)->cv.cv_waiters);		\
 			cv_broadcast(&(x)->cv);				\
 		}							\
 	} else								\
 		panic("%s(%d): [PCM RELEASE] Releasing non-BUSY cv!",	\
 		    __func__, __LINE__);				\
 } while (0)
 
 /* Quick version, for shorter path. */
 #define PCM_ACQUIRE_QUICK(x)	do {					\
 	if (PCM_LOCKOWNED(x))						\
 		panic("%s(%d): [PCM ACQUIRE QUICK] Mutex owned!",	\
 		    __func__, __LINE__);				\
 	PCM_LOCK(x);							\
 	PCM_WAIT(x);							\
 	PCM_ACQUIRE(x);							\
 	PCM_UNLOCK(x);							\
 } while (0)
 
 #define PCM_RELEASE_QUICK(x)	do {					\
 	if (PCM_LOCKOWNED(x))						\
 		panic("%s(%d): [PCM RELEASE QUICK] Mutex owned!",	\
 		    __func__, __LINE__);				\
 	PCM_LOCK(x);							\
 	PCM_RELEASE(x);							\
 	PCM_UNLOCK(x);							\
 } while (0)
 
 #define PCM_BUSYASSERT(x)	do {					\
 	if (!((x) != NULL && ((x)->flags & SD_F_BUSY)))			\
 		panic("%s(%d): [PCM BUSYASSERT] "			\
 		    "Failed, snddev_info=%p", __func__, __LINE__, x);	\
 } while (0)
 
 #define PCM_GIANT_ENTER(x)	do {					\
 	int _pcm_giant = 0;						\
 	if (PCM_LOCKOWNED(x))						\
 		panic("%s(%d): [GIANT ENTER] PCM lock owned!",		\
 		    __func__, __LINE__);				\
 	if (mtx_owned(&Giant) != 0 && snd_verbose > 3)			\
 		device_printf((x)->dev,					\
 		    "%s(%d): [GIANT ENTER] Giant owned!\n",		\
 		    __func__, __LINE__);				\
 	if (!((x)->flags & SD_F_MPSAFE) && mtx_owned(&Giant) == 0)	\
 		do {							\
 			mtx_lock(&Giant);				\
 			_pcm_giant = 1;					\
 		} while (0)
 
 #define PCM_GIANT_EXIT(x)	do {					\
 	if (PCM_LOCKOWNED(x))						\
 		panic("%s(%d): [GIANT EXIT] PCM lock owned!",		\
 		    __func__, __LINE__);				\
 	if (!(_pcm_giant == 0 || _pcm_giant == 1))			\
 		panic("%s(%d): [GIANT EXIT] _pcm_giant screwed!",	\
 		    __func__, __LINE__);				\
 	if ((x)->flags & SD_F_MPSAFE) {					\
 		if (_pcm_giant == 1)					\
 			panic("%s(%d): [GIANT EXIT] MPSAFE Giant?",	\
 			    __func__, __LINE__);			\
 		if (mtx_owned(&Giant) != 0 && snd_verbose > 3)		\
 			device_printf((x)->dev,				\
 			    "%s(%d): [GIANT EXIT] Giant owned!\n",	\
 			    __func__, __LINE__);			\
 	}								\
 	if (_pcm_giant != 0) {						\
 		if (mtx_owned(&Giant) == 0)				\
 			panic("%s(%d): [GIANT EXIT] Giant not owned!",	\
 			    __func__, __LINE__);			\
 		_pcm_giant = 0;						\
 		mtx_unlock(&Giant);					\
 	}								\
 } while (0)
 #else /* !SND_DIAGNOSTIC */
 #define PCM_WAIT(x)		do {					\
 	PCM_LOCKASSERT(x);						\
 	while ((x)->flags & SD_F_BUSY)					\
 		cv_wait(&(x)->cv, (x)->lock);				\
 } while (0)
 
 #define PCM_ACQUIRE(x)		do {					\
 	PCM_LOCKASSERT(x);						\
 	KASSERT(!((x)->flags & SD_F_BUSY),				\
 	    ("%s(%d): [PCM ACQUIRE] Trying to acquire BUSY cv!",	\
 	    __func__, __LINE__));					\
 	(x)->flags |= SD_F_BUSY;					\
 } while (0)
 
 #define PCM_RELEASE(x)		do {					\
 	PCM_LOCKASSERT(x);						\
 	KASSERT((x)->flags & SD_F_BUSY,					\
 	    ("%s(%d): [PCM RELEASE] Releasing non-BUSY cv!",		\
 	    __func__, __LINE__));					\
 	(x)->flags &= ~SD_F_BUSY;					\
 	if ((x)->cv.cv_waiters != 0)					\
 		cv_broadcast(&(x)->cv);					\
 } while (0)
 
 /* Quick version, for shorter path. */
 #define PCM_ACQUIRE_QUICK(x)	do {					\
 	PCM_UNLOCKASSERT(x);						\
 	PCM_LOCK(x);							\
 	PCM_WAIT(x);							\
 	PCM_ACQUIRE(x);							\
 	PCM_UNLOCK(x);							\
 } while (0)
 
 #define PCM_RELEASE_QUICK(x)	do {					\
 	PCM_UNLOCKASSERT(x);						\
 	PCM_LOCK(x);							\
 	PCM_RELEASE(x);							\
 	PCM_UNLOCK(x);							\
 } while (0)
 
 #define PCM_BUSYASSERT(x)	KASSERT(x != NULL &&			\
 				    ((x)->flags & SD_F_BUSY),		\
 				    ("%s(%d): [PCM BUSYASSERT] "	\
 				    "Failed, snddev_info=%p",		\
 				    __func__, __LINE__, x))
 
 #define PCM_GIANT_ENTER(x)	do {					\
 	int _pcm_giant = 0;						\
 	PCM_UNLOCKASSERT(x);						\
 	if (!((x)->flags & SD_F_MPSAFE) && mtx_owned(&Giant) == 0)	\
 		do {							\
 			mtx_lock(&Giant);				\
 			_pcm_giant = 1;					\
 		} while (0)
 
 #define PCM_GIANT_EXIT(x)	do {					\
 	PCM_UNLOCKASSERT(x);						\
 	KASSERT(_pcm_giant == 0 || _pcm_giant == 1,			\
 	    ("%s(%d): [GIANT EXIT] _pcm_giant screwed!",		\
 	    __func__, __LINE__));					\
 	KASSERT(!((x)->flags & SD_F_MPSAFE) ||				\
 	    (((x)->flags & SD_F_MPSAFE) && _pcm_giant == 0),		\
 	    ("%s(%d): [GIANT EXIT] MPSAFE Giant?",			\
 	    __func__, __LINE__));					\
 	if (_pcm_giant != 0) {						\
 		mtx_assert(&Giant, MA_OWNED);				\
 		_pcm_giant = 0;						\
 		mtx_unlock(&Giant);					\
 	}								\
 } while (0)
 #endif /* SND_DIAGNOSTIC */
 
 #define PCM_GIANT_LEAVE(x)						\
 	PCM_GIANT_EXIT(x);						\
 } while (0)
 
 #endif /* _KERNEL */
 
 #endif	/* _OS_H_ */
diff --git a/sys/modules/sound/sound/Makefile b/sys/modules/sound/sound/Makefile
index 5dd628d9f342..833330ef9b26 100644
--- a/sys/modules/sound/sound/Makefile
+++ b/sys/modules/sound/sound/Makefile
@@ -1,36 +1,36 @@
 
 SYSDIR?=${SRCTOP}/sys
 
 .PATH: ${SYSDIR}/dev/sound
 .PATH: ${SYSDIR}/dev/sound/pcm
 .PATH: ${SYSDIR}/dev/sound/midi
 .PATH: ${SYSDIR}/dev/sound/isa
 
 KMOD=	sound
 SRCS=	device_if.h bus_if.h isa_if.h pci_if.h opt_isa.h
 SRCS+=	ac97_if.h channel_if.h feeder_if.h mixer_if.h
 SRCS+=	ac97_if.c channel_if.c feeder_if.c mixer_if.c
 SRCS+=	feeder.c feeder_rate.c feeder_volume.c
 SRCS+=	feeder_chain.c feeder_eq.c feeder_format.c
 SRCS+=	feeder_matrix.c feeder_mixer.c
 SRCS+=	feeder_eq_gen.h feeder_rate_gen.h snd_fxdiv_gen.h
 SRCS+=	mpu_if.h mpufoi_if.h synth_if.h
 SRCS+=	mpu_if.c mpufoi_if.c synth_if.c
-SRCS+=	ac97.c ac97_patch.c buffer.c channel.c clone.c dsp.c
+SRCS+=	ac97.c ac97_patch.c buffer.c channel.c dsp.c
 SRCS+=	mixer.c sndstat.c sound.c unit.c vchan.c
 SRCS+=	midi.c mpu401.c sequencer.c
 
 feeder_eq_gen.h:	${SYSDIR}/tools/sound/feeder_eq_mkfilter.awk
 	${AWK} -f ${SYSDIR}/tools/sound/feeder_eq_mkfilter.awk -- ${FEEDER_EQ_PRESETS} > ${.TARGET}
 
 feeder_rate_gen.h:	${SYSDIR}/tools/sound/feeder_rate_mkfilter.awk
 	${AWK} -f ${SYSDIR}/tools/sound/feeder_rate_mkfilter.awk -- ${FEEDER_RATE_PRESETS} > ${.TARGET}
 
 snd_fxdiv_gen.h:	${SYSDIR}/tools/sound/snd_fxdiv_gen.awk
 	${AWK} -f ${SYSDIR}/tools/sound/snd_fxdiv_gen.awk -- > ${.TARGET}
 
 CLEANFILES+=	feeder_eq_gen.h feeder_rate_gen.h snd_fxdiv_gen.h
 
 EXPORT_SYMS=	YES	# XXX evaluate
 
 .include <bsd.kmod.mk>