Commit graph

43650 commits

Author SHA1 Message Date
Adrian Chadd
46de4d9fc2 net80211: change ieee80211_ratectl_rate() to not return a rix
There are only a few places where the returned rix is used:

* linuxkpi - logging
* bwi/bwn - used for finding a fallback rate to choose, which
  honestly should be returned by the ratectl API
* iwm - building the rateset to program into firmware

Everyone else uses the dot11rate value in ni->ni_txnode.

This is a precursor for VHT and later rate support; where currently
there aren't rate tables in ieee80211_phy.c for VHT and later
rates.

Although it's likely doable to add tables for VHT, 11ax and MU-OFDMA
(HE) rates are sufficiently larger/different to just not fit in the
current scheme without more refactoring.

Differential Revision:	https://reviews.freebsd.org/D48603
Reviewed by:	bz, thj
2025-02-26 11:29:36 -08:00
Adrian Chadd
7067450010 sys: convert ni->ni_txrate references use to the new net80211 API
This just mechanically converts things.

* For linuxkpi, it was just used for display.
* For uath, it was just used for display, as firmware
  doesn't report it up.

Differential Revision:	https://reviews.freebsd.org/D48602
Reviewed by:	bz, thj
2025-02-26 11:29:18 -08:00
Navdeep Parhar
e19d84979a cxgbe(4): Block most access to the hardware as soon as the adapter stops.
Add a new hw_all_ok() routine and use it to avoid hardware access in the
public control interfaces (ifnet ioctls, ifmedia calls, etc.).  Continue
to use hw_off_limits() in the private ioctls/sysctls and other debug
code.  Retire adapter_stopped() as it's of no use by itself.

This fixes problems where ifnet slow-path operations would enter a
synch_op just before set_adapter_hwstatus(false) and touch the hardware
when it's not safe to do so.

MFC after:	1 week
Sponsored by:	Chelsio Communications
2025-02-25 11:33:40 -08:00
Warner Losh
dc95228d98 nvme: Fix hotplug on one of the amazon platforms
Amazon EC2 m7i cloud instances use PCI hotplug rather than ACPI
hotplug. The card is removed and detach is called to remove the drive
from the system. The hardware is no longer present at this point, but
the bridge doesn't translate the now-missing hardware reads to all ff's
leading us to conclude the hardware is there and we need to do a proper
shutdown of it. Fix this oversight by asking the bridge if the device is
still present as well. We need both tests since some systems one cane
remove the card w/o a hotplug event and we want to fail-safe in those
cases.

Convert gone to a bool while I'm here and update a comment about
shutting down the controller and why that's important.

Tested by: cperciva
Sponsored by: Netflix
2025-02-25 09:36:53 -07:00
Christos Margiolis
bc7e65e950 sound: Call chn_kill() in chn_init() failure
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D48966
2025-02-25 13:44:37 +02:00
Christos Margiolis
2868776c9c sound: Update comment and channel insertion in vchan_create()
The comment and rationale behind choosing CHN_INSERT_SORT_DESCEND()
instead of CHN_INSERT_SORT_ASCEND() are no longer relevant as of FILLME
("sound: Allocate vchans on-demand").

Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D48962
2025-02-25 13:44:30 +02:00
Christos Margiolis
fd906e47b1 sound: Simplify locking during device creation
The mechanism of acquiring SD_F_BUSY in pcm_init() and releasing it in
pcm_register() is a leftover from the previous device creation scheme,
where pcm_init() (previously pcm_register()) would create the sysctl
nodes, as well as the device node. In this scenario, acquiring SD_F_BUSY
was necessary, in order to avoid races in case the device was accessed
before it was ready for use. Commit 66f3eb14e9 ("sound: Move sysctl
and /dev/dspX creation to pcm_setstatus()") fixed this issue, so we can
simplify things now. Only acquire SD_F_BUSY in pcm_addchan(), because
chn_init() expects to be called with SD_F_BUSY acquired.

While here, move the sndstat_register() call further down to be more
robust.

Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Reviewed by:	markj
Differential Revision:	https://reviews.freebsd.org/D48482
2025-02-25 13:44:24 +02:00
Christos Margiolis
352aa9ad1d snd_uaudio: Remove undefined functions
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Reviewed by:	dev_submerge.ch, markj, emaste
Differential Revision:	https://reviews.freebsd.org/D48424
2025-02-25 13:44:18 +02:00
Christos Margiolis
40616b7e41 sound: Return if the new speed/format is the same as the current one
This gives us a slight performance boost since we do not have to go
through chn_setparam() and the driver functions.

Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Reviewed by:	dev_submerge.ch, emaste
Differential Revision:	https://reviews.freebsd.org/D48012
2025-02-25 13:44:12 +02:00
Christos Margiolis
4e1b75bebf sound: Get rid of redundant variables in chn_setspeed() and chn_setformat()
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Reviewed by:	dev_submerge.ch, emaste
Differential Revision:	https://reviews.freebsd.org/D48011
2025-02-25 13:44:05 +02:00
Christos Margiolis
6524d2a5af sound: Remove SNDBUF_LOCKASSERT()
It's a no-op. There is no lock associated with the buffer.

Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Reviewed by:	dev_submerge.ch, markj
Differential Revision:	https://reviews.freebsd.org/D48008
2025-02-25 13:43:59 +02:00
Christos Margiolis
1cbafcd137 sound: Handle multiple primary channel cases in vchan sysctls
vchan_getparentchannel() is used by various vchan sysctl functions to
fetch the first primary channel. However, this assumes that all devices
have only one primary channel per direction. If a device does not meet
this assumption, then the sysctl functions will be applying the
configurations on the first primary channel only.

Since we now have the "primary" channel sublist, we can retire
vchan_getparentchannel() and iterate through the "primary" list in each
sysctl function and apply the settings to all primary channels.

Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Reviewed by:	dev_submerge.ch
Differential Revision:	https://reviews.freebsd.org/D48336
2025-02-25 13:43:52 +02:00
Christos Margiolis
b50f53cf87 sound: Cache vchanmode
We already cache vchanrate and vchanformat.

Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Reviewed by:	dev_submerge.ch
Differential Revision:	https://reviews.freebsd.org/D48335
2025-02-25 13:43:46 +02:00
Christos Margiolis
02d4eeabfd sound: Allocate vchans on-demand
Refactor pcm_chnalloc() and merge with parts of vchan_setnew() (now
removed) and dsp_open()’s channel creation into a new dsp_chn_alloc()
function. The function is responsible for either using a free HW channel
(if vchans are disabled), or allocating a new vchan.

Clean up allocated vchans associated with a given dsp_cdevpriv on
dsp_close() instead of leaving them unused.

hw.snd.vchans_enable (previously hw.snd.maxautovchans) and
dev.pcm.X.{play|rec}.vchans now work as tunables to only enable/disable
vchans, as opposed to setting their number and/or (de-)allocating
vchans. Since these sysctls do not trigger any (de-)allocations anymore,
their effect is instantaneous, whereas before we could have frozen the
machine (when trying to allocate new vchans) when setting
dev.pcm.X.{play|rec}.vchans to a very large value.

Create a new "primary" channel sublist so that we do not waste time
looping through all channels in dsp_chn_alloc(), since we are only
looking for a parent channel to either use, or add a new vchan to. This
guarantees a steady traversal speed, as the parent channels are most
likely going to be just a handful (2). What was currently in place was a
loop through the whole channel list, which meant that the traversal
would take longer the more channels were added to that list.

Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Reviewed by:	dev_submerge.ch
Differential Revision:	https://reviews.freebsd.org/D47917
2025-02-25 13:43:39 +02:00
Christos Margiolis
d39be38a35 sound: Report actual vchanrate and vchanformat in sysctl
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Reviewed by:	dev_submerge.ch
Differential Revision:	https://reviews.freebsd.org/D48435
2025-02-25 13:43:33 +02:00
Christos Margiolis
e89ee05b7c sound: Initialize channels with sane default rate and format
There is no good reason to initialize with AFMT_U8 at 8000Hz.

Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Reviewed by:	dev_submerge.ch
Differential Revision:	https://reviews.freebsd.org/D48434
2025-02-25 13:43:26 +02:00
Christos Margiolis
2546ab1b36 sound: Call vchan_destroy() on vchan_create() failure
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Reviewed by:	dev_submerge.ch
Differential Revision:	https://reviews.freebsd.org/D48183
2025-02-25 13:43:19 +02:00
Christos Margiolis
405b1e5092 sound: Do not fail from vchan_destroy() if children list is empty
vchan_destroy() should be able to call chn_kill() regardless of whether
the channel has been added to the children list yet or not. Also remove
the CHN_F_BUSY check. There is no reason we shouldn't execute the code
below if the parent is not busy.

Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Reviewed by:	dev_submerge.ch
Differential Revision:	https://reviews.freebsd.org/D48185
2025-02-25 13:43:11 +02:00
Christos Margiolis
164651f16c sound: Do not return an error from chn_notify() if the children list is empty
An empty children list does not mean that there is an error.

Reported by:	Florian Walpen <dev@submerge.ch>
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Reviewed by:	dev_submerge.ch
Differential Revision:	https://reviews.freebsd.org/D48156
2025-02-25 13:42:59 +02:00
Wei Hu
a18e999454 mana: Increase default tx and rx ring size to 1024
Tcp perfomance tests show high number of retries under heave tx
traffic. The numbers of queue stops and wakeups also increase.
Further analysis suggests the FreeBSD network stack tends to send
TSO packets with multiple sg entries, typically ranging from
10 to 16. On mana, every two sgs takes one unit of tx ring.
Therefore, adding up one unit for the head, it takes 6 to 9 units
of tx ring to send a typical TSO packet.

Current default tx ring size is 256, which can get filled up
quickly under heavy load. When tx ring is full, the send queue
is stopped waiting for the ring space to be freed. This could
cause the network stack to drop packets, and lead to tcp
retransmissions.

Increase the default tx and rx ring size to 1024 units. Also
introduce two tuneables allowing users to request tx and rx ring
size in loader.conf:
        hw.mana.rx_req_size
        hw.mana.tx_req_size
When mana is loading, the driver checks these two values and
round them up to power of 2. If these two are not set or
the request values are out of the allowable range, it sets the
default ring size instead.

Also change the tx and rx single loop completion budget to 8.

Tested by:	whu
MFC after:	2 weeks
Sponsored by:	Microsoft
2025-02-24 13:56:06 +00:00
Adrian Chadd
9f32893b05 qcom_ess_edma: Add the IPQ4018/IPQ4019 ethernet MAC/MDIO driver.
This adds the ESS EDMA driver introduced by the IPQ4018/IPQ4019.

It provides a number of transmit and receive rings which can be mapped
into virtual ethernet devices, which this driver supports.

It's partially integrated into the ar40xx etherswitch which supplies
the port and some filtering/VPN offload functionality. This driver
only currently supports the per-port options which allow for the
virtual ethernet driver mapping.

This was written by reverse engineering the functionality of the
ethernet switch and ethernet driver support provided by Qualcomm
Atheros via their OpenWRT contributions.  The code is all originally
authored by myself.

Differential Revision:	https://reviews.freebsd.org/D49027
2025-02-20 18:48:12 -08:00
John Baldwin
11509c6ef2 nvmft: Export more info for a ctl port for use by ctladm
In particular, export a "port" entry as well as an array of "host"
entries for each active connection.

Reviewed by:	asomers
Sponsored by:	Chelsio Communications
Differential Revision:	https://reviews.freebsd.org/D48775
2025-02-20 10:31:20 -05:00
John Baldwin
97ca2ada80 nvmft: Switch the per-port lock from sx(9) to mtx(9)
This is needed to avoid LORs for a following commit.

Sponsored by:	Chelsio Communications
2025-02-20 10:31:20 -05:00
Christos Margiolis
18457e7e25 sound: Bail out early if a format is not supported
If a format is unsupported, the feeder_build_* functions will fail
anyway, so bail out early to avoid unnecessary computation.

This is also needed by a series of upcoming patches to the feeder
framework.

Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D48031
2025-02-18 21:37:22 +02:00
Christos Margiolis
c23d53490e snd_hda: Define ALC898
PR:		207996
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Reviewed by:	markj, emaste
Differential Revision:	https://reviews.freebsd.org/D48940
2025-02-18 21:37:21 +02:00
Christos Margiolis
d4176fdb13 snd_hda: Fix typo (s/owerflow/overflow)
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
2025-02-18 21:35:52 +02:00
Mark Johnston
c76c2a19ae vmm: Consolidate code which manages guest memory regions
On all three platforms supported by vmm, we have mostly duplicated code
to manage guest physical memory regions.  Deduplicate much of this code
and move it into sys/dev/vmm/vmm_mem.c.

To avoid exporting struct vm outside of machdep vmm.c, add a new
struct vm_mem to contain the memory segment descriptors, and add a
vm_mem() accessor, akin to vm_vmspace().  This way vmm_mem.c can
implement its routines without needing to see the layout of struct vm.

The handling of the per-VM vmspace is also duplicated but will be moved
to vmm_mem.c in a follow-up patch.

On amd64, move the ppt_is_mmio() check out of vm_mem_allocated() to keep
the code MI, as PPT is only implemented on amd64.  There are only a
couple of callers, so this is not unreasonable.

No functional change intended.

Reviewed by:	jhb
Differential Revision:	https://reviews.freebsd.org/D48270
2025-02-18 16:00:07 +00:00
Bojan Novković
19f202f859 sdhci: Fixes for sdhci_fdt_rockchip.c
This change fixes a couple of issues in the Rockchip SDHCI driver:
 - Fix a panic caused by sdhci_fdt_rockchip_attach not populating the
   softc's dev variable before initializing clocks
 - Fix a bug where sdhci_fdt_rockchip_set_clock fails to call
   sdhci_fdt_set_clock

Fixes:	e17e33f997
Reported by:	Alonso Cárdenas Márquez (acardenas@bsd-peru.org)
2025-02-16 11:41:43 +01:00
Adrian Chadd
0f10a33fc1 ar40xx: fix to compile/run under the new ifnet rules
Locally tested:

* IPQ4018, Asus router, w/ ethernet driver

Differential Revision:	https://reviews.freebsd.org/D49025
Reviewed by:	imp, zlei
2025-02-15 12:43:42 -08:00
Adrian Chadd
89e3c2d27a flash: add w25n (nand flash) support
This adds read only support for the W25N series of flash parts.

Specifically starting with the W25N01GV, a 128MiB SPI NAND flash.

This doesn't currently support writing or erasing, as this requires
a NAND flash layer that we don't currently have.  There are also
plenty of other commands that aren't currently supported - notably
maintaining the on-chip flash translation layer, flash wear statistics,
etc.

But read support is fine enough for now; it at least allows for
reading the boot / config / calibration flash on my ASUS IPQ4018 based
router.

Reviewed by:	imp
Differential Revision:	https://reviews.freebsd.org/D48979
2025-02-14 19:03:55 -08:00
Jesper Schmitz Mouridsen
b968644127 mtw: Use correct cmd for radio
Approved by:	adrian, wireless
Differential Revision:	https://reviews.freebsd.org/D49003
2025-02-14 16:20:40 +01:00
Jasper Tran O'Leary
73c3fe4db3 gve: Fix qpl_buf_head being initialized improperly
Currently, for DQO QPL our MPASS assertion on qpl_buf_head for available
pending_pkts (i.e. not holding a packet) fails due to incorrect
initialization. The MPASS fails on the first run of packets through the
ring when INVARIANTS is on, and when INVARIANTS is off, things work
without a bug.

The MPASS guards against improper reaping of "pending_pkt" objects,
and thus was failing for the first run through the ring. By correctly
initializing the objects in this patch we make the MPASS not fail on the
first run too.

Signed-off-by: Vee Agarwal <veethebee@google.com>
Signed-off-by: Jasper Tran O'Leary <jtranoleary@google.com>

Reviewed by:	delphij, markj
MFC after:	2 weeks
Differential Revision:	https://reviews.freebsd.org/D48968
2025-02-14 15:08:23 +00:00
Jasper Tran O'Leary
031800c786 gve: Do minor cleanup and bump version
This commit fixes several minor issues:

- Removes an unnecessary function pointer parameter on gve_start_tx_ring
- Adds a presubmit check against style(9)
- Replaces mb() and rmb() macros with native
  atomic_thread_fence_seq_cst() and atomic_thread_fence_acq()
  respectively
- Fixes various typos throughout
- Increments the version number to 1.3.2

Co-authored-by: Vee Agarwal <veethebee@google.com>
Signed-off-by: Vee Agarwal <veethebee@google.com>
Signed-off-by: Jasper Tran O'Leary <jtranoleary@google.com>

Reviewed by:	delphij, markj
MFC after:	2 weeks
Differential Revision:	https://reviews.freebsd.org/D48969
2025-02-14 15:08:23 +00:00
Jasper Tran O'Leary
62b2d0c3f4 gve: Fix memory leak during reset
Before this change, during reset we were allocating new memory for
priv->ptype_lut_dqo, irq_db_array and the counter_array over the old
memory. This change ensures we do not allocate new memory during reset
and avoid memory leaks.

Signed-off-by: Vee Agarwal <veethebee@google.com>
Signed-off-by: Jasper Tran O'Leary <jtranoleary@google.com>

Reviewed by:	delphij, markj
MFC after:	2 weeks
Differential Revision:	https://reviews.freebsd.org/D48970
2025-02-14 15:08:18 +00:00
Jasper Tran O'Leary
909e2d7b69 gve: Disallow MTUs within a problematic range
If hardware LRO is enabled with GVE, then setting the driver's MTU to a
range of values around 8000 will cause dropped packets and drastically
degraded performance. While this issue is being investigated, we need
to prohibit the driver's MTU being set to a value within this range.

Signed-off-by: Jasper Tran O'Leary <jtranoleary@google.com>

Reviewed by:	delphij, markj
MFC after:	2 weeks
Differential Revision:	https://reviews.freebsd.org/D48971
2025-02-14 14:57:06 +00:00
Zhenlei Huang
91bae242bc bnxt_en: Improve sysctl handler bnxt_dcb_list_app()
Prefer sbuf_new_for_sysctl() over error-prone manually managed buffer.

No functional change intended.

Reviewed by:	markj
Tested by:	Daniel Porsch <daniel.porsch@loopia.se>
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D48496
2025-02-14 18:38:30 +08:00
Zhenlei Huang
747fd2db53 bnxt_en: Remove pointless NULL check for sysctl arg1
Those sysctl handlers have been guaranteed to have non-null softc. No
need for NULL check within sysctl handlers.

No functional change intended.

Reviewed by:	markj
Tested by:	Daniel Porsch <daniel.porsch@loopia.se>
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D48495
2025-02-14 18:38:30 +08:00
Zhenlei Huang
0bc672b38f bnxt_en: Fix the description of sysctl knob dev.bnxt.X.dcb.dcbx_cap
While here, update the description of dev.bnxt.X.dcb to more informative
words "Data Center Bridging".

Reviewed by:	markj
Fixes:	35b53f8c98 bnxt_en: Add PFC, ETS & App TLVs protocols support
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D48993
2025-02-14 18:38:30 +08:00
Zhenlei Huang
3de231b4d9 bnxt_en: Retrieve maximum of 128 APP TLVs
It appears that the maximum number of APP TLVs supported by the hardware
is 128 according to D45005. Well Daniel Porsch reported an issue PR284073
which shows that the number can exceed the limit, causing out of bound
write to on-stack allocated variable app[128] and the kernel panics.

Limit to 128 while retrieving APP TLVs.

PR:		284073
Reviewed by:	markj
Tested by:	Daniel Porsch <daniel.porsch@loopia.se>
Fixes:	35b53f8c98 bnxt_en: Add PFC, ETS & App TLVs protocols support
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D48589
2025-02-14 18:38:29 +08:00
Navdeep Parhar
04bf43505b cxgbe(4): Use correct priority in begin_synchronized_op.
It was always set to PCATCH because the driver tested (INTR_OK) instead
of (flags & INTR_OK).  Fit a WITNESS_WARN in a single line while here.

MFC after:	1 week
Sponsored by:	Chelsio Communications
2025-02-13 22:15:18 -08:00
Navdeep Parhar
f79fba05a0 cxgbe(4): Remove smt_idx from the L2 table entry structure.
An L2 table entry isn't associated with a particular SMT (Source MAC
Table) entry.

MFC after:	1 week
Sponsored by:	Chelsio Communications
2025-02-13 21:54:59 -08:00
Navdeep Parhar
9d76f6d042 cxgbe(4): Remove some unused PCI routines and associated headers.
MFC after:	1 week
Sponsored by:	Chelsio Communications
2025-02-13 20:52:25 -08:00
Navdeep Parhar
762d32354a cxgb(4): Use routines from pci(9) instead of hand rolled equivalents.
There is no need to include private PCI headers in the driver.

MFC after:	1 week
Sponsored by:	Chelsio Communications
2025-02-13 20:44:23 -08:00
Navdeep Parhar
f4ab14044c cxgbe(4): Make sure suspend/resume works in recovery mode.
The driver does minimal initialization in this mode and suspend/resume
should ignore resources that aren't setup.  This is for debug only.

kenv hw.cxgbe.sos="1"
kldload if_cxgbe
devctl suspend t6nex0
devctl resume t6nex0

MFC after:	1 week
Sponsored by:	Chelsio Communications
2025-02-13 16:41:50 -08:00
Kevin Bowling
124b7722aa igc: Remove unused register IGC_RXD_SPC_VLAN_MASK
We don't use legacy receive descriptors and masking out the vlan ID
isn't necessary since the tag is in the standard format, so remove it.

MFC after:	3 days
2025-02-13 11:26:35 -07:00
Aurelien Cazuc
4b29599fbb e1000: Fix vlan PCP/DEI on lem(4)
The vlan PCP and CFI/DEI were discarded when receiving vlan tagged
packets on lem(4) interfaces with vlanhwtag.

According to the 82540 SDM[1] (pg. 24), vlan tag is in the standard
format, so there's no reason to discard PCP/DEI.

[1]: http://iommu.com/datasheets/ethernet/controllers-nics/intel/e1000/pci-pci-x-family-gbe-controllers-software-dev-manual.pdf

MFC after:	3 days
Sponsored by:	Stormshield (author)
Differential Revision:	https://reviews.freebsd.org/D48987
2025-02-13 11:20:26 -07:00
Konstantin Belousov
1fbce7deef mlx5 ipsec: return EOPNOTSUPP for unsupported SAs instead of EINVAL
The ipsec offload infra requires the EOPNOTSUPP error from driver to
understand that the SA is valid but offload cannot be performed.

Sponsored by:	NVidia networking
2025-02-13 12:32:32 +02:00
Konstantin Belousov
2e794b7733 mlx5: add synthetic error for MLX5_CMD_OP_QUERY_FLOW_COUNTER when device is down
Sponsored by:	NVidia networking
2025-02-13 12:32:32 +02:00
John Baldwin
d6cce475cb mtw: Pass the right pointer to the constructed command in mtw_mcu_radio
This was just using random stack garbage before.

Reported by:	GCC -Wunused-but-set-variable
2025-02-12 17:17:00 -05:00
Jose Luis Duran
4b77a9a80c
uath: Avoid a NULL dereference
PR:		284643
Reviewed by:	adrian
Approved by:	emaste (mentor)
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D48948
2025-02-12 15:33:26 +00:00