NextBSD · Driver delivery · kext candidate table

The firmware & multi-version drivers — the kext short-list

A sub-reference of the driver-delivery plan. Under the rule kext ⇐ has-firmware ∨ needs-multi-version, these are the drivers that actually earn kext treatment — what hardware they're for, whether their firmware is base-owned or a ports package you must bake in, and their proposed NextBSD kext name. Everything else stays a plain kld on native devmatch.

Compiled 2026-07-17 from five source-grounded agents (FreeBSD man pages, FreshPorts / the ports tree, sys/contrib/dev firmware Makefiles, and your own kld-to-kext catalog + gen-*-personalities.sh scripts). Provisional — sub of the IOKit sidebar; verify per-chip package lists against FreshPorts at build time. Planning only.

The honest count

Applying firmware ∨ multi-version to FreeBSD's real driver landscape gives ~38 driver kexts + ~13 separate firmware-image kexts ≈ ~50 total — so the earlier "~50–60" holds once you count the firmware blobs as their own org.nextbsd.firmware.* kexts (which your design does). The driver count alone is ~38, tighter than 50–60. Either way, the remaining ~250 of the catalog's 343 candidates stay plain klds.

WiFi drivers
23
GPU DRM (fw)
3
nvidia branches
6
Eth/storage/crypto
6
Firmware-image kexts
~13
How to read the "firmware origin" column base = firmware already ships in the FreeBSD source tree (sys/contrib/dev/…, built as a .ko via FIRMWS) — NextBSD gets it for free, it's already base-owned. port/pkg = firmware ships only via a net/wifi-firmware-* / graphics/gpu-firmware-* port — NextBSD must build it from linux-firmware.git and bake it into the image (never via pkg on the target — per the base-never-requires-pkg constraint). restricted = not redistributable as a binary package (build-from-source or user-supplied only). "gen?" = a gen-*-personalities.sh match-table generator already exists.

AWiFi — 23 drivers (the bulk of the list)

Every FreeBSD wifi driver that needs a firmware blob. Native drivers carry their firmware in base; the LinuxKPI drivers get it from ports. All are strong kext candidates (P2 firmware); several also carry multiple firmware versions.

Driver (KMOD)Chips / vendorFirmware originFirmware pkg / base moduleNextBSD kextgen?Status / flags
if_iwlwifiIntel 7000→BE200 (AX210/BZ/SC…)port/pkgnet/wifi-firmware-iwlwifi-kmod (-7000/-8000/-9000/-22000/-ax210/-bz/-sc)IntelIwlwifiPrimary Intel path; Tier-0 first conversion target
if_iwmIntel AC 3160/7260/7265/8260/8265/9260baseiwmfw (9 chip-gen blobs)IntelIWMCurrent; multi-firmware
if_iwnIntel 1000/2000/4965/5000/6000baseiwnfw (13 blobs)IntelIWNLegacy
if_wpiIntel PRO/Wireless 3945ABGbasewpifwIntelWPILegacy
if_ipwIntel PRO/Wireless 2100base license-ackipwfwIntelIPWNeeds legal.intel_ipw.license_ack=1
if_iwiIntel PRO/Wireless 2200/2915base license-ackiwifwIntelIWINeeds legal.intel_iwi.license_ack=1
if_rtwn (+Pci/Usb)Realtek RTL8188E/8192C/8812A/8821AbasertwnfwRtwn / RtwnPci / RtwnUsbCurrent; absorbed old urtwn
if_rsuRealtek RTL8188SU/8192SU (USB)basersufwrsu-rtl8712fwRsu
if_rtw88Realtek RTL8723D/8812A/8821C/8822B/Cport/pkgnet/wifi-firmware-rtw88-kmod (8 subpkgs)Rtw88Current
if_rtw89Realtek RTL8852A/B/C/8922A (WiFi 6/6E/7)port/pkgnet/wifi-firmware-rtw89-kmod (6 subpkgs)Rtw89Current
if_otusAtheros AR9170 (USB)baseotusfw (init + main)OtusLegacy
if_uathAtheros AR5523 (USB)baseloaded by uathload(8)UathLegacy; userland loader, not a FIRMWS .ko
if_ath10kQCA988x/9984/6174/9377port/pkgnet/wifi-firmware-ath10k-kmod (9 subpkgs)Ath10kWIP — station-mode mostly
if_ath11kQCA IPQ60xx/QCA6390/WCN6855port/pkgnet/wifi-firmware-ath11k-kmod (9 subpkgs)Ath11kWIP — needs compile work
if_ath12kQualcomm QCN9274/WCN7850 (WiFi 7)port/pkgnet/wifi-firmware-ath12k-kmodAth12kWIP/TODO
if_ralRalink RT2561/2661/2860baseralfw (4 blobs)RalLegacy (RT2560 needs no fw)
if_runRalink/MediaTek RT2700U–RT3900E (USB)baserunfwRunCommon older USB
if_mt76MediaTek MT7601U/7915/7921/7925/7996port/pkgnet/wifi-firmware-mt76-kmod + -mt7601u-kmodMt76WIP; MT7921/7925 modern targets
if_mwlMarvell 88W8363 (PCI)basemwlfwMwlRare
if_maloMarvell Libertas 88W8335restrictedmalofwno public firmwareMaloEffectively unusable; treat unsupported
if_bwnBroadcom BCM43xx (v4 ucode)restrictednet/bwn-firmware-kmodsource-build only (b43-fwcutter)BWnNo binary pkg → can't bake prebuilt
if_bwiBroadcom BCM43xx (v3 ucode)restrictednet/bwi-firmware-kmod — source-build onlyBWiLegacy; same constraint as bwn
if_upgtConexant/Intersil PrismGT (USB)restrictedupgtfwno public firmwareUpgtLegacy; unsupported without user blob

WiFi takeaways: 12 are base (firmware free, already in-tree — iwm iwn wpi ipw iwi rtwn rsu otus uath ral run mwl); 7 are port/pkg you must bake in (iwlwifi rtw88 rtw89 mt76 ath10k/11k/12k); 4 are restricted and effectively unshippable (bwn bwi malo upgt). Only iwlwifi has a generator today.

BGPU DRM — 3 firmware drivers

The DRM drivers pull GuC/HuC/DMC (Intel), SMU/PSP/VCN (AMD) blobs via LinuxKPI. Firmware lives in the graphics/gpu-firmware-*-kmod ports (per-ASIC flavors); the driver .ko comes from graphics/drm-kmod. Both are port/pkg → bake in.

Driver (KMOD)Hardware familyFirmware package (per-ASIC flavors)NextBSD kextgen?
i915kmsIntel iGPU Gen9→Xe2 (Skylake→Arc/Battlemage)graphics/gpu-firmware-intel-kmod — ~14 flavors (skylake…battlemage)IntelGraphics✓ gen-i915
amdgpuAMD GCN/RDNA/CDNA + Ryzen APUs (SI→RDNA3)graphics/gpu-firmware-amd-kmod — ~40 flavors (polaris/vega/navi/…)AMDGraphics✓ gen-amdgpu
radeonkmsPre-GCN & early-GCN Radeon (R100→SI/CIK)graphics/gpu-firmware-radeon-kmod — ~42 flavorsRadeonGraphics✓ gen-radeon

Also multi-version: the DRM .kos themselves ship from a versioned graphics/drm-kmod (drm-66-kmod Linux-6.6-LTS default on 15.0, drm-612-kmod for 15.1+) — a kernel-tracking version axis, not firmware. The gpu-firmware-kmod metaport just pulls all three vendor firmware ports.

Cnvidia — 6 coexisting branches (the multi-version case)

Not firmware-primary — the trigger is P3 multi-version. All six branches coexist on disk; the matcher autoloads exactly one by GPU. Each provides nvidia.ko + nvidia-modeset.ko + nvidia-drm.ko. ✓ gen-nvidia covers all six via -b <legacybranch>.

Branch (port)Hardware familyGSP firmware?NextBSD kextNotes
x11/nvidia-driver (595.84)Turing+ (RTX 20/30/40/50)yes (Turing+)NVIDIAGraphics595Dropped all pre-Turing; Blackwell requires GSP
x11/nvidia-driver-580Maxwell→Blackwell (GTX 900→RTX 50)yes (Turing+)NVIDIAGraphics580Broad "production" branch
x11/nvidia-driver-470Kepler (GTX 600/700) → AmperenoNVIDIAGraphics470Last Kepler branch
x11/nvidia-driver-390Fermi (GeForce 400/500) + KeplernoNVIDIAGraphics390modeset-only tier
x11/nvidia-driver-340Tesla (GeForce 8/9/100/200/300)noNVIDIAGraphics340core-only tier
x11/nvidia-driver-304Curie (GeForce 6/7)noNVIDIAGraphics304Oldest; carries a vuln notice
Correction to an earlier assumption FreshPorts currently shows 304, 340, and 390 all still build packages for FreeBSD 15 and 16 (304/340/390 amd64+i386; 470/580/595 amd64-only). So the premise that the oldest branches don't build on 15.x is not borne out — they remain buildable via FreeBSD patches despite being EOL upstream. The real risk to 304/340 is if NextBSD trims i386 or diverges from those patches. GSP is disabled by default on FreeBSD (breaks suspend/resume) — enable via hw.nvidia.registry.EnableGpuFirmware=1; mandatory for Blackwell.

DEthernet / storage / crypto — 6 firmware drivers

Outside wifi/GPU, only these genuinely load a firmware blob — and (unlike wifi) all their firmware is in FreeBSD base, so no ports involved.

Driver (KMOD)Chips / vendorClassFirmware module (base)NextBSD kextNotes
if_iceIntel E800 (E810 100G, E82x)ethernetice_ddpIceWithout it → NIC drops to Safe Mode
if_cxgbeChelsio T4/T5/T6/T7ethernett4fw_cfg/t5fw_cfg/t6fw_cfg/t7fw_cfgCXGBEEmbeds fw image + config
if_cxgbChelsio T3ethernetcxgb_t3fwCXGBLegacy T3 generation
if_mxgeMyricom Myri10GEethernetmxge_eth_z8e (+ ethp/rss variants)MxgeMissing fw → reduced-perf mode
ispQLogic FC HBA (ISP24xx–28xx)storage (FC)ispfw (isp_2400isp_2800)IspOnly 2400–2800 in current tree
qat (+qat_c2xxx)Intel QuickAssist crypto accelcryptoqatfw / qat_c2xxxfwQatLoads firmware via firmware(9)

ELooks like firmware — but is NOT a kext candidate

Easy to misclassify. These have firmware, but it's compiled into the driver or resident in on-card flash — no loadable blob, so under the rule they stay plain klds (or compiled-in). The catalog over-lists some of these; correct it.

Driver(s)Why not a firmware kext
bxe, qlnxeInit microcode compiled into the .ko (*_init_values.c, ecore_*) — no runtime blob
mlx4en, mlx5en, sfxge, oce, qlxgbe, qlxgeOn-card flash firmware, updated out-of-band (mstflint/vendor tools) — the catalog lists these with "+fw"; they should be reclassified to plain kld
mpr, mps, mpi3mr, mrsas, mfi, ciss, smartpqiSAS/RAID HBA firmware lives in on-card flash (sas3flash/storcli) — driver loads no blob
ahd/ahc (aic79xx/aic7xxx)Sequencer microcode generated at build time by aicasm — compiled-in, not firmware(9)
if_em / IntelEMe1000 has no firmware. It has a gen-em script only because it's the first Ethernet match-table conversion target — orthogonal to firmware. (Naming nit: the script header says IntelEthernet.kext, the catalog row says IntelEM — reconcile.)
USB ethernet (axe/axge/ure/muge/…), snd_*, tpmNo base firmware blob for any of these

FThe ~13 firmware-image kexts

Your design also packages each firmware blob as its own org.nextbsd.firmware.* kext (the driver kext depends on it via OSBundleLibraries, or bundles it in Resources/ per D4). These are what make the driver count of ~38 reach the "~50" total.

IceDdp · IPWFirmware · ISPFirmware · IWIFirmware · IWNFirmware · MwlFirmware · OtusFirmware · QatFirmware · QatC2xxxFirmware · RalFirmware · RtwnFirmware · WPIFirmware · (iwmfw-derived). These are base-owned blobs staged from sys/contrib/dev/<x>/ via each <x>fw/Makefile's FIRMWS= line — the port/pkg wifi + GPU firmware (iwlwifi, rtw88/89, mt76, ath*, gpu-firmware-*) are baked from linux-firmware.git instead.

GGenerators: what exists vs what to write

Personality generators today Exist: gen-iwlwifi, gen-i915 (IntelGraphics), gen-amdgpu (AMDGraphics), gen-radeon (RadeonGraphics), gen-nvidia (all 6 branches via -b), gen-em (firmware-less, match-table only). To write (firmware drivers with no generator yet): the base-firmware wifi set (iwm iwn wpi ipw iwi rtwn rsu otus ral run mwl), the LKPI wifi set (rtw88 rtw89 mt76 ath10k/11k/12k), and ice mxge cxgb cxgbe isp qat. Each just emits IOPCIPrimaryMatch = 0xDDDDVVVV + IOProbeScore 10000 from the driver's own PCI-ID table.

Caveats for a shipping reference