NextBSD · Driver delivery · kext candidate table
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.
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.
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.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 / vendor | Firmware origin | Firmware pkg / base module | NextBSD kext | gen? | Status / flags |
|---|---|---|---|---|---|---|
if_iwlwifi | Intel 7000→BE200 (AX210/BZ/SC…) | port/pkg | net/wifi-firmware-iwlwifi-kmod (-7000/-8000/-9000/-22000/-ax210/-bz/-sc) | IntelIwlwifi | ✓ | Primary Intel path; Tier-0 first conversion target |
if_iwm | Intel AC 3160/7260/7265/8260/8265/9260 | base | iwmfw (9 chip-gen blobs) | IntelIWM | — | Current; multi-firmware |
if_iwn | Intel 1000/2000/4965/5000/6000 | base | iwnfw (13 blobs) | IntelIWN | — | Legacy |
if_wpi | Intel PRO/Wireless 3945ABG | base | wpifw | IntelWPI | — | Legacy |
if_ipw | Intel PRO/Wireless 2100 | base license-ack | ipwfw | IntelIPW | — | Needs legal.intel_ipw.license_ack=1 |
if_iwi | Intel PRO/Wireless 2200/2915 | base license-ack | iwifw | IntelIWI | — | Needs legal.intel_iwi.license_ack=1 |
if_rtwn (+Pci/Usb) | Realtek RTL8188E/8192C/8812A/8821A | base | rtwnfw | Rtwn / RtwnPci / RtwnUsb | — | Current; absorbed old urtwn |
if_rsu | Realtek RTL8188SU/8192SU (USB) | base | rsufw → rsu-rtl8712fw | Rsu | — | — |
if_rtw88 | Realtek RTL8723D/8812A/8821C/8822B/C | port/pkg | net/wifi-firmware-rtw88-kmod (8 subpkgs) | Rtw88 | — | Current |
if_rtw89 | Realtek RTL8852A/B/C/8922A (WiFi 6/6E/7) | port/pkg | net/wifi-firmware-rtw89-kmod (6 subpkgs) | Rtw89 | — | Current |
if_otus | Atheros AR9170 (USB) | base | otusfw (init + main) | Otus | — | Legacy |
if_uath | Atheros AR5523 (USB) | base | loaded by uathload(8) | Uath | — | Legacy; userland loader, not a FIRMWS .ko |
if_ath10k | QCA988x/9984/6174/9377 | port/pkg | net/wifi-firmware-ath10k-kmod (9 subpkgs) | Ath10k | — | WIP — station-mode mostly |
if_ath11k | QCA IPQ60xx/QCA6390/WCN6855 | port/pkg | net/wifi-firmware-ath11k-kmod (9 subpkgs) | Ath11k | — | WIP — needs compile work |
if_ath12k | Qualcomm QCN9274/WCN7850 (WiFi 7) | port/pkg | net/wifi-firmware-ath12k-kmod | Ath12k | — | WIP/TODO |
if_ral | Ralink RT2561/2661/2860 | base | ralfw (4 blobs) | Ral | — | Legacy (RT2560 needs no fw) |
if_run | Ralink/MediaTek RT2700U–RT3900E (USB) | base | runfw | Run | — | Common older USB |
if_mt76 | MediaTek MT7601U/7915/7921/7925/7996 | port/pkg | net/wifi-firmware-mt76-kmod + -mt7601u-kmod | Mt76 | — | WIP; MT7921/7925 modern targets |
if_mwl | Marvell 88W8363 (PCI) | base | mwlfw | Mwl | — | Rare |
if_malo | Marvell Libertas 88W8335 | restricted | malofw — no public firmware | Malo | — | Effectively unusable; treat unsupported |
if_bwn | Broadcom BCM43xx (v4 ucode) | restricted | net/bwn-firmware-kmod — source-build only (b43-fwcutter) | BWn | — | No binary pkg → can't bake prebuilt |
if_bwi | Broadcom BCM43xx (v3 ucode) | restricted | net/bwi-firmware-kmod — source-build only | BWi | — | Legacy; same constraint as bwn |
if_upgt | Conexant/Intersil PrismGT (USB) | restricted | upgtfw — no public firmware | Upgt | — | Legacy; 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.
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 family | Firmware package (per-ASIC flavors) | NextBSD kext | gen? |
|---|---|---|---|---|
i915kms | Intel iGPU Gen9→Xe2 (Skylake→Arc/Battlemage) | graphics/gpu-firmware-intel-kmod — ~14 flavors (skylake…battlemage) | IntelGraphics | ✓ gen-i915 |
amdgpu | AMD GCN/RDNA/CDNA + Ryzen APUs (SI→RDNA3) | graphics/gpu-firmware-amd-kmod — ~40 flavors (polaris/vega/navi/…) | AMDGraphics | ✓ gen-amdgpu |
radeonkms | Pre-GCN & early-GCN Radeon (R100→SI/CIK) | graphics/gpu-firmware-radeon-kmod — ~42 flavors | RadeonGraphics | ✓ 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.
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 family | GSP firmware? | NextBSD kext | Notes |
|---|---|---|---|---|
x11/nvidia-driver (595.84) | Turing+ (RTX 20/30/40/50) | yes (Turing+) | NVIDIAGraphics595 | Dropped all pre-Turing; Blackwell requires GSP |
x11/nvidia-driver-580 | Maxwell→Blackwell (GTX 900→RTX 50) | yes (Turing+) | NVIDIAGraphics580 | Broad "production" branch |
x11/nvidia-driver-470 | Kepler (GTX 600/700) → Ampere | no | NVIDIAGraphics470 | Last Kepler branch |
x11/nvidia-driver-390 | Fermi (GeForce 400/500) + Kepler | no | NVIDIAGraphics390 | modeset-only tier |
x11/nvidia-driver-340 | Tesla (GeForce 8/9/100/200/300) | no | NVIDIAGraphics340 | core-only tier |
x11/nvidia-driver-304 | Curie (GeForce 6/7) | no | NVIDIAGraphics304 | Oldest; carries a vuln notice |
hw.nvidia.registry.EnableGpuFirmware=1; mandatory for Blackwell.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 / vendor | Class | Firmware module (base) | NextBSD kext | Notes |
|---|---|---|---|---|---|
if_ice | Intel E800 (E810 100G, E82x) | ethernet | ice_ddp | Ice | Without it → NIC drops to Safe Mode |
if_cxgbe | Chelsio T4/T5/T6/T7 | ethernet | t4fw_cfg/t5fw_cfg/t6fw_cfg/t7fw_cfg | CXGBE | Embeds fw image + config |
if_cxgb | Chelsio T3 | ethernet | cxgb_t3fw | CXGB | Legacy T3 generation |
if_mxge | Myricom Myri10GE | ethernet | mxge_eth_z8e (+ ethp/rss variants) | Mxge | Missing fw → reduced-perf mode |
isp | QLogic FC HBA (ISP24xx–28xx) | storage (FC) | ispfw (isp_2400…isp_2800) | Isp | Only 2400–2800 in current tree |
qat (+qat_c2xxx) | Intel QuickAssist crypto accel | crypto | qatfw / qat_c2xxxfw | Qat | Loads firmware via firmware(9) |
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, qlnxe | Init microcode compiled into the .ko (*_init_values.c, ecore_*) — no runtime blob |
mlx4en, mlx5en, sfxge, oce, qlxgbe, qlxge | On-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, smartpqi | SAS/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 / IntelEM | e1000 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_*, tpm | No base firmware blob for any of these |
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.
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.net/wifi-firmware-* and gpu-firmware-* flavors) track linux-firmware.git and change often — verify against FreshPorts at build time.t4fw-1.27.5.0.bin, iwlwifi ucode API versions) drift between releases; keep firmware in lockstep with the driver in your base.bwn bwi malo upgt) can't be shipped as prebaked firmware — decide whether to carry the drivers at all.ispfw's per-chip module list and whether t7fw/newer flavors exist on your exact NextBSD source snapshot (they're recent).