Dell VEP/VMWare Edge/Velo Cloud SD-WAN/VeraCloud VEP1400/VEP1400-X firewall units

Notice: Page may contain affiliate links for which we may earn a small commission through services like Amazon Affiliates or Skimlinks.

individualeleven

New Member
Aug 6, 2026
10
6
3
1st of all: Thank you so much for doing this!
No problem. It was quite a fun and interesting challenge to put all the pieces together and stumble through PHP, Volt, etc to get the web GUI piece working.

Went through the entire thread hoping there was someone that had previously updated the BIOS on this unit / resolved the watchdog reboot issue; (Watchdog issue seems to be good now after pressing the internal board button that restarts the device) I was still way off from getting OPNsense fully working.
AFAIK, there aren't any publicly available BIOS updates for the 610. I'd recommend against doing the BIOS updates for any of these, unless you need a feature like SR-IOV working (I vaguely recall nmpu saying that there was an issue with SR-IOV not working correctly on older firmwares). I tried flashing a VEP1400-X BIOS onto one of my 610s and while it did flash correctly, start-up speed was stalled because the BIOS in the first slot (the one I "upgraded") would always crash and then the backup slot would have to take over. I eventually managed to fix it in DiagOS by switching the BIOS slot to the second slot (there's a tool in DiagOS that does this, I'd have to check since it's been months), dumping the second slot, switching back to the first and using flashrom (not the DELL provided tool) to reflash the first slot.

The watchdog is taken care of in the vep1400-init early script; currently it is "hard-coded" to just turn it off and unless the timer was set really short, OPNsense usually boots fast enough to hit the early script and turn off the watchdog, so messing with buttons or installing/booting DiagOS isn't needed anymore if you're turning this into an OPNsense appliance (and using the plug-in/installer image).

If I am understanding correctly there is currently no way to see all 8 interfaces independently? i.e. GE1 through GE5 will always be bridged together without a way to treat them as separate interfaces?
Not at a hardware level like 620+ (VEP1400-X) units. You can however, approximate this by editing the vep1400-init script and adjusting the etherswitchcfg to have each port on a separate VLAN and creating the relevant VLANs in OPNsense. I had been planning on creating a separate plugin to manage the etherswitchcfg, but before I do that, I should really work on my PHP skills and my understanding of how the MVC (web GUI) framework in OPNsense works. My drive just hasn't been there though.

Anyway, the relevant lines in /usr/local/etc/rc.syshook.d/50-vep1400-init (lines 50-57):
Code:
        if [ -e /dev/etherswitch0 ]; then
            etherswitchcfg config vlan_mode dot1q
            etherswitchcfg port1 pvid 2 port2 pvid 2 port3 pvid 2 port4 pvid 2 port5 pvid 2 port6 pvid 3 port9 pvid 3 port10 pvid 2 vlangroup0 vlan 2 members 1,2,3,4,5,10 vlangroup1 vlan 3 members 6,9
            echo "Marvell 88E6190 configured. LAN ports are 1-5 and are connected to ix0. WAN is on port 6 and is connected to ix1."
            logger -t "vep1400-hw" "Marvell 88E6190 configured. LAN is on ports 1-5 and is connected to ix0. WAN is on port 6 and is connected to ix1."
        else
            logger -t "vep1400-hw" "VEP1400 detected, but no etherswitch dev found. Is patched kernel installed?"
        fi
To do a single port per VLAN, it would be something like this:
Code:
        if [ -e /dev/etherswitch0 ]; then
            etherswitchcfg config vlan_mode dot1q
            # set the PVIDs for each port first, can't start with PVID 1 on access ports cause that's the native VLAN for untagged traffic
            etherswitchcfg port1 pvid 2 port2 pvid 3 port3 pvid 4 port4 pvid 5 port5 pvid 6 port6 pvid 7 port9 pvid 1 port10 pvid 1
            # create VLAN groups on switch. Port 10 is CPU port 0 aka ix0, Port 9 is CPU port 1 aka ix1
            # PVIDs above have to match VLAN defined in the groups below
            # in this configuration, CPU ports have to be tagged on both the switch and in the OS
            etherswitchcfg vlangroup0 vlan 2 members 1,10t
            etherswitchcfg vlangroup1 vlan 3 members 2,10t
            etherswitchcfg vlangroup2 vlan 4 members 3,10t
            etherswitchcfg vlangroup3 vlan 5 members 4,9t
            etherswitchcfg vlangroup4 vlan 6 members 5,9t
            etherswitchcfg vlangroup5 vlan 7 members 6,9t
            #echo "Marvell 88E6190 configured. LAN ports are 1-5 and are connected to ix0. WAN is on port 6 and is connected to ix1."
            #logger -t "vep1400-hw" "Marvell 88E6190 configured. LAN is on ports 1-5 and is connected to ix0. WAN is on port 6 and is connected to ix1."
        else
            logger -t "vep1400-hw" "VEP1400 detected, but no etherswitch dev found. Is patched kernel installed?"
        fi
This example has ports 1-3 on separate VLANs on ix0, and 4-6 on separate VLANs on ix1. Then you just need to create the VLAN interfaces in the OPNsense interface assignment script. Adjust it to your needs or if the above creates a VLAN conflict on your network. Keep in mind though that this creates additional routing load on the SoC and can degrade performance. That's why I went with the above 1-5/6 split for LAN/WAN on the switch.


Also, was able to upgrade to OPNsense 26.7.4_1 without having to do anything special, curious if upgrading to newer releases would be different, I am still not too sure I understand the kernel modifications that were performed, are they specific to this specific kernel version / OPNsense release or is it some sort of patch automatically applied on any kernel?
Yes, you were able to upgrade without losing the switch because I "pinned" (borrowing a Linux bootloader term) the kernel so that it doesn't get overwritten during the upgrade. The downside to this is that you didn't really upgrade the kernel, it's still on 26.7.2. I need to build a new one with the 26.7.4 patches. I'll either edit this post or make a new one with the new kernel set when it's built.

It's fine (sort of) to run an older kernel with a newer userspace, as long as they are same version (in this case 15.1). FreeBSD expects userspace and the kernel to be more tightly bound version-wise (compared to Linux) because it's all one distro and it's all built at the same time, as far as I understand.

The normal locations for FreeBSD kernels are /boot/kernel/ and /boot/kernel.old/. When a kernel update is done, the system moves the current running one to /boot/kernel.old (replacing the one that's already there if it exists) and then extracts the new kernel into /boot/kernel/. This way if something is wrong or incompatible with the new kernel, you can boot the old one. I have defined in the OPNsense build tools to move the kernel to /boot/kernel.vep1400 when it's building the images for the VEP1400/Edge 610 and to include a loader.conf.local file that forces the FreeBSD loader to *always* boot the kernel.vep1400 kernel and to provide the hints (FreeBSD kernel variables) that instruct the kernel on where to find the Marvell switch chip.

The only kernel modification that I did was to use the patch labeled "ixgbe: add MDIO bus support" from the official FreeBSD repo/discussion board here. I think, if memory serves, FreeBSD 16 is supposed to include this code by default, so, when OPNsense gets around to using 16 (maybe 27.1 or 27.7; I can't say for sure (they haven't made any announcements/roadmaps about it), but to be fair, 16 is still in pre-release I think), unless they turn if off, these boxes will just work without any kernel patching and pinning(still need a loader.conf.local though for the switch hints).

Installed as UFS on eMMC
Good, you really don't want ZFS on an eMMC. I don't know why they give that as an option (for MMC/SSD), ZFS really needs to be used on mechanical HDDs or enterprise SSDs. From what I've read, it being used on anything else will wear out the storage faster.

On that topic, another recommendation to reduce wear on the eMMC, turn on the RAM disks for log and tmp (here under System, Settings, Miscellaneous) and set them to 5-10% (since you don't have a lot of RAM). If you get that M.2 adapter and put a proper SSD in there, you can leave these off.

1790186040182.png

One other recommendation, set these tunables (and reboot) to switch the kernel into multi-threaded routing. In your case, you'll want to set them to 2 (or just do like the guide says and set them to -1). Might not matter much for the 610, since the guides I've seen say this is really important for multi-gig routing, but couldn't hurt. And if somehow it does, just delete them and reboot.
1790187013113.png

More info here.
 
Last edited:
  • Like
Reactions: abq

ericloewe

Active Member
Apr 24, 2017
353
170
43
32
ZFS is fine on eMMC, as long as you don't try to do things that make eMMC sad, like throwing a mountain of logs at it. ZFS tends to highlight the shortcomings of low-end flash devices, but it does offer important functionality (boot environments come to mind, though I'm not sure what the status of those is in OPNsense).
 
  • Like
Reactions: individualeleven

individualeleven

New Member
Aug 6, 2026
10
6
3
Ok, good to know, I had been seeing a lot of mixed results about using it on solid state storage. It still feels like a bit overkill for embedded devices imo, but the features are nice. I don't know about the boot environments either, but OPNsense does offer ZFS snaphots in the GUI.
 

violet.evergarden

New Member
Sep 5, 2026
2
6
3
Long time lurker, first time contributing to a thread. Picked up an Edge 610 on ebay last week, wanted to get the ethernet ports to work on Debian. Spent some time poking around and a few tokens with ChatGPT but managed to get the switch chip configured and the 6 ethernet ports accessible. You will have to build your kernel with DSA support, and use a custom kernel module to bitbang configure the Marvell switch chip. If you want to give it a try yourselves I have the generalized version of the code linked below.


Note, it is possible to bitbang configure the switch chip with only user level code, but it will be limited to bridging between the host ports and the ethernet ports on the front, if that sounds like it would work for you, let me know and publish that one too. I have only tried this with Debian Trixie, but my goal was to set this up on VyOS which is why I started with Debian directly.
Thank you for your open-source project. Based on your work, I successfully got the DSA switch working on OpenWrt 25.12. All ports from GE1 to GE6 are now properly detected and can forward traffic normally.
The project is still in its early stages. Once it becomes more mature and complete, I will publish the related driver code.
610.png
610-1.png
610-2.png
 

upalachango

Member
May 28, 2023
35
5
8
I'm dealing with a bricked Dell EMC VEP1400-X (Edge 620) and could really use some advice from anyone familiar with this hardware architecture.
...
My Question: Since this enterprise unit supposedly features a dual-BIOS design, is there a specific physical method (jumper, hidden button sequence, or pin short) to force the CPLD to ignore the corrupted primary chip and boot from the Backup BIOS?

Or, because it's entering a hardware halt in just 5 seconds, is my only viable path to clip a CH341A SPI programmer directly onto the primary Winbond 25Q128JVSQ (U73) SOIC8 chip and flash a clean .bin externally?

Any guidance, documentation, or tips on recovering these boards would be greatly appreciated. Thanks in advance!
Get the CH341A and just reflash it directly. I somehow ended up corrupting my bios during an upgrade as well and it was surprisingly painless to use the programmer. So much so I would consider skipping the dell update tools if I ever wanted to upgrade again. Like Arnaud, mine corrupted in a way that it couldn't failback to the secondary BIOS. I wouldn't be surprised if that's the primary failure mode for the BIOS process.

============

It's been awhile since I've looked at this project but I'm excited to get back into it. I've got proxmox running and was able to use the fan script by Redhot411 to tame the noise. I think I'm still going to swap the fans for Noctuas now that I can control "rpm" (quotes because I suspect fantool has a LUT between RPM and voltage that won't necessarily match the noctuas). With that I've got three main goals:

1) As it stands the current fan setup is really strange. The bottom fans seem to be creating a negative pressure system, pulling air out the bottom and drawing fresh air in the from the sides. The fans also aren't even mounted under the CPU but appear to be cooling the backside of the intel 10g NIC chips, via the thermal insulating PCB. Granted I'm not a engineer specializing in thermal design, but "blow on hot thing directly" seems pretty intuitive. I'll take a thermal camera to verify that assumption.

If the heat is concentrated on the top of the PCB, I am considering printing a new top shell that's a few mm taller. Then I can remount the fans to the side of the case and directly blow air across the CPU heatsink and NICs. I'll add a heatsink to the 10gb NIC directly regardless just for extra passive cooling. This also means I can use the 40x20 noctuas instead of the 10mm ones for lower noise and higher airflow if I don't just do a fan delete altogether. I'm trying to make this as quiet as possible as it'll be installed in a living room. The current thermal design seems about as unoptimized as possible so I'm hoping a few basic tweaks make a huge difference.

2) My plan is to use this as a proxmox host for most of my network services that are lightweight, but mostly to virtualize OPNSense. The problem is getting QAT fully working. It's in this weird quasi-state where proxmox detects it but I can't pass it through as a PCI device to OPNsense. It's like the hardware driver is loaded, but none of the expected software to actually use QAT is installed (even the systemctl QAT service is missing). I'm going to try and install the QAT driver from Intel directly. If anyone has experience on that front, I'd be grateful for any advice.

3) Lastly, I'm not using the WLAN card, so I'm going to swap it out with a mini PCIe to ethernet card. Currently proxmox is reporting the mPCIe is link capped at 2.5Gt/s but I suspect (nmpu and the C3xxx block diagrams also suggest) that it can actually do PCIe gen3 speeds. There's an mPCIe to single 2.5Gbe board using an intel I226V that should work down to gen1 speeds, but there's also a dual 2.5gbe card using a realtek RTL8125B. Having even one 2.5gbe would make a difference for those with multigigabit internet speeds but having a pair would really open options and be convenient. Usual caveats of Realtek and I226 chips and freebsd compatibility still apply of course.

No matter what, these 1405 boxes are quirky but quite fun to tinker with. And this thread has been amazingly fantastic for dealing with those quirks!
 

nmpu

Active Member
Sep 22, 2023
253
125
43
Bradenton, Florida, USA
Currently proxmox is reporting the mPCIe is link capped at 2.5Gt/s but I suspect (nmpu and the C3xxx block diagrams also suggest) that it can actually do PCIe gen3 speeds.
Mini-PCIe only supports a single lane. You've got PCIe 3 x 1. As I recall, a garden-variety NVMe performs similar to the SATA III drive. That connector also has USB 2.0 if you're brave enough to solder the missing choke. I only have experience with 640/680. I assume the 620 is the same.

Dell's official statement is there are no user-serviceable components inside. I've swapped the SATA drive and used a mini-PCIe to NVMe adapter. In both cases, I chose drives that were low power. I've also had success with the 3.3V USB data signals. I rigged a stack of adapters so that I can use both concurrently. I caution experimentation. Let someone else be the gunnie pig. The power management ICs on this device are very tiny, private datasheet, and custom-programmed. If you damage one or downstream parts, your machine will reboot endlessly. If your network module uses additional pins for configuration or status, something could go pop.

Also beware that removing expected hardware could result in a prolonged boot process. The device will make 3 attempts with the primary BIOS before moving to the secondary BIOS which is less strict. It's possible to modify NVRAM settings to continue on a POST fail.
 

rkrenicki

Member
Feb 2, 2016
73
49
18
47
Another question for the group here. I have a 640 that I am trying to put ESX on. I grabbed the Latest ESXi 7.0u3 Dell Customized image (VMware-VMvisor-Installer-7.0.0.update03-24585291.x86_64-Dell_Customized-A26.iso), and installed it.. but it only sees the two 10g ports, but numbers them as vmnic2 and vmnic3. None of the copper ports show up anywhere.

I did see that for the VEP1405 series documentation, it calls out a specific build of ESX 6.7u2 (available here) that I have not yet tried, but I was hoping for a known working 7.0 or newer that recognizes all, or at least some, of the copper ports. I seems that people in here are cagey about posting a link to it, but if you can at least tell me the file name for the appropriate version.. it would be appreciated.
 

nmpu

Active Member
Sep 22, 2023
253
125
43
Bradenton, Florida, USA
I have a 640 running DEL-ESXi-703_19898904-A05 (Dell Inc.) which shows all the network ports. As you can see from the screenshot, this setup hasn't been touched in several years so the BIOS and ESXi aren't even current.
ESXi_Edge640.png
Code:
lspci | grep -i ethernet

0000:02:00.0 Ethernet controller: Intel(R) I350 Gigabit Network Connection [vmnic4]
0000:02:00.1 Ethernet controller: Intel(R) I350 Gigabit Network Connection [vmnic5]
0000:02:00.2 Ethernet controller: Intel(R) I350 Gigabit Network Connection [vmnic6]
0000:02:00.3 Ethernet controller: Intel(R) I350 Gigabit Network Connection [vmnic7]
0000:05:00.0 Ethernet controller: Intel(R) Ethernet Connection X553 10 GbE SFP+ [vmnic3]
0000:05:00.1 Ethernet controller: Intel(R) Ethernet Connection X553 10 GbE SFP+ [vmnic2]
0000:06:00.0 Ethernet controller: Intel(R) Ethernet Connection X553 1GbE [vmnic1]
0000:06:00.1 Ethernet controller: Intel(R) Ethernet Connection X553 1GbE [vmnic0]
Can you see all the ports in the BIOS?
 
  • Like
Reactions: rkrenicki

ccie4526

Active Member
Jan 25, 2021
243
162
43
esxi680.png

Code:
[root@esxi-edge680:~] lspci | grep -i ethernet
0000:02:00.0 Ethernet controller: Intel(R) I350 Gigabit Network Connection [vmnic4]
0000:02:00.1 Ethernet controller: Intel(R) I350 Gigabit Network Connection [vmnic5]
0000:02:00.2 Ethernet controller: Intel(R) I350 Gigabit Network Connection [vmnic6]
0000:02:00.3 Ethernet controller: Intel(R) I350 Gigabit Network Connection [vmnic7]
0000:05:00.0 Ethernet controller: Intel(R) Ethernet Connection X553 10 GbE SFP+ [vmnic3]
0000:05:00.1 Ethernet controller: Intel(R) Ethernet Connection X553 10 GbE SFP+ [vmnic2]
0000:07:00.0 Ethernet controller: Intel(R) Ethernet Connection X553 1GbE [vmnic1]
0000:07:00.1 Ethernet controller: Intel(R) Ethernet Connection X553 1GbE [vmnic0]
[root@esxi-edge680:~]
Forget where I found the Dell custom ISO, it took a bunch of googling. I'll check my archives for it.

That whole thing about the missing copper ports, I ran into that before, if memory serves I resolved it through those two little buttons that do the bios reset and all that, posted somewhere earlier in this thread.
 
  • Like
Reactions: rkrenicki

rkrenicki

Member
Feb 2, 2016
73
49
18
47
I have a 640 running DEL-ESXi-703_19898904-A05 (Dell Inc.) which shows all the network ports. As you can see from the screenshot, this setup hasn't been touched in several years so the BIOS and ESXi aren't even current.

Can you see all the ports in the BIOS?
I do see them all in the BIOS, and I was able to see them in OPNsense with the plugin from earlier in the thread too, so I know the ports do indeed work.

Forget where I found the Dell custom ISO, it took a bunch of googling. I'll check my archives for it.
For future users, I found that one here: VMware ESXi 7.0 U3 | Driver Details | Dell US

That whole thing about the missing copper ports, I ran into that before, if memory serves I resolved it through those two little buttons that do the bios reset and all that, posted somewhere earlier in this thread.
ah, that might be it. I do not think I have reset this specific unit with the buttons.. I will give that a try, thanks!
 
  • Like
Reactions: abq

rkrenicki

Member
Feb 2, 2016
73
49
18
47
That whole thing about the missing copper ports, I ran into that before, if memory serves I resolved it through those two little buttons that do the bios reset and all that, posted somewhere earlier in this thread.
Just to circle back on this, That did the trick. I had reset my 620s, but I guess I never did it to this 640. I also found a newest version of the Dell customized 7.0 Update 3s ISO from April 2025 (VMware-VMvisor-Installer-7.0.0.update03-24585291.x86_64-Dell_Customized-A26.iso, findable with a google search for that in a number of spots), and everything is happy.

For future reference, this was the order that the ports were enumerated, at least under this build of ESX.
 

Attachments

  • Like
Reactions: blunden

upalachango

Member
May 28, 2023
35
5
8
Mini-PCIe only supports a single lane. You've got PCIe 3 x 1. As I recall, a garden-variety NVMe performs similar to the SATA III drive. That connector also has USB 2.0 if you're brave enough to solder the missing choke. I only have experience with 640/680. I assume the 620 is the same.
I think you're right. I wasn't sure as normally lspci will show the max speed and let you know that the device is "downgraded" when using a lower speed. There are several BIOS settings though that let you control PCIe speeds and most are set to "auto" so I'm guessing the BIOS is negotiating the speeds and hiding the max PCIe speed from the OS.

Anyway, I installed the dual 2.5gbe RJ45 card and it was detected and is running at Gen 2 speeds. It uses an ASM1182e chip to split a Gen2 lane into 2 lanes. I suspect throwing in a Gen 3 would get lspci to show a max speed of 8GT/s x1 lane.

The next problem I'm running into is the 640 refuses to boot from the primary BIOS because the WLAN card was removed. This is throwing a critical device failure that causes a reboot. @nmpu were you able to turn this off in the BIOS or using DIAGOS? Or did you just rely on the more permissive secondary bios for boot? I'd prefer to have it boot into the primary as it takes almost 5 minutes, plus I'm sure to lose or forget the wlan card if I ever need to get back into the primary BIOS on this device.

Also, for anyone interested in the fans. It's such an odd design. The fans are only cooling the I350 NIC directly. They aren't really cooling the CPU in any meaningful way. Given other variants of this device are also using the I350 but have no fans installed, I think just doing a full fan delete is good enough. Long term testing might prove otherwise but I think just a little heatsink should work fine to split the difference.
 
Last edited:

nmpu

Active Member
Sep 22, 2023
253
125
43
Bradenton, Florida, USA
The next problem I'm running into is the 640 refuses to boot from the primary BIOS because the WLAN card was removed. This is throwing a critical device failure that causes a reboot. @nmpu were you able to turn this off in the BIOS or using DIAGOS? Or did you just rely on the more permissive secondary bios for boot?

The warning and solution are in the same post you just replied to.
Also beware that removing expected hardware could result in a prolonged boot process. The device will make 3 attempts with the primary BIOS before moving to the secondary BIOS which is less strict. It's possible to modify NVRAM settings to continue on a POST fail.
nvramtool is part of DiagOS.
 

upalachango

Member
May 28, 2023
35
5
8
The warning and solution are in the same post you just replied to.
I tried searching but I somehow missed it in +800 comments lol. I do remember reading that half a year ago though. I may play around with the nvram if I'm feeling adventurous.

This little box has been such a fantastic test bed for tinkering with a lot of low level tools. Maybe one day I'll actually use it as a router lol.
 

violet.evergarden

New Member
Sep 5, 2026
2
6
3
system.PNG
interface.png


Progress Update
Development is currently based on the 25.12 branch, with the kernel using Linux 6.12.108. The following features have been confirmed to be working properly:
  1. Ports GE1–GE6 of the mv88e6085 switch chip are functioning normally.
  2. The SFP1 and SFP2 interfaces are working normally. (Note: some Base-1000T modules have compatibility issues that cause abnormal behavior of the data activity LED and link LED, but this does not affect normal operation.)
  3. The QCA9880 wireless chip is working normally.
  4. iperf3 throughput tests reach a maximum speed of approximately 870 Mbps, for both upstream and downstream.
Pending Issues
  1. Eth0 and Eth1 are currently connected to the mv88e6085 switch chip in a Bond configuration, but there is no bandwidth aggregation effect. I am trying to configure GE1–GE3 to use Eth0 and GE4–GE6 to use Eth1; this may not succeed, and I am still working on resolving this issue. However, it does not affect current usage.
 
  • Like
Reactions: abq and blunden

upalachango

Member
May 28, 2023
35
5
8
I dug a little into DiagOS nvramtool. Looks like dell explicitly removed the "POST Stop on Error" control. In their own documentation of nvramtool for the VEP14x5 series they show bit 2 controls POST Stop on Error = 1 in offset 0x54. Their own example for writing the bits is actually disabling Stop on error behavior. I don't know when this changed. I went back to ufw v1.6 (bios ver. 3.48.0.9-11) and updated the BIOS and NVRAM but it still showed the below nvram structure. The 2:1 means bits 1 through 2 are used for verbose mode. It's annoying and very Dell of them. Especially since that means a bad wifi card (a common failure) can wreak havoc on your device.

Code:
POST Control Bits : offset 0x54 = 0x2
    7 Force Cold Boot = 0
    6 POST Extended Upper DRAM test = 0
    5 POST Extended Lower DRAM test = 0
    4 POST Extended tests = 0
    3 Reserved = 0
 2: 1 POST Verbose Mode = 1
    0 POST Enable = 0
Also, there's a similar Control Byte for EDA but I disabled Stop on Error and saw no changes in behavior. I went through every possible combination setting the 0x54 control byte to 3,5, and 7 hoping that the Stop on Error bit was just visually hidden from nvramtool but still functional. No luck. Eventually I just disabled POST. While not great, this "fixes" the long boot times and allows you to boot into the Primary BIOS instead of just the Backup BIOS. I'm not happy about it, but for home use it's fine. [Insert obvious "not for production" disclaimers here]

At this point I'm satisfied, but may revisit this to learn more about modifying a BIOS. I'm sure there's just a single bit buried somewhere in the binary file that needs to be flipped from 1 to 0. Then you can still get POST without it actually rebooting on failure because hardware has changed from factory defaults. Dell has just obfuscated that control bit. Or just taking the hardware IDs and adding those to the N variant entries which clearly aren't rebooting without a wifi card. Or even just giving the primary BIOS the same behavior of the Backup BIOS where it'll boot despite errors.

For those wanting to replicate, I used the below command from within DiagOS. Any even value should work with --val=0x0 being the most basic and val=0x02 disabling POST but keeping verbose mode.

nvramtool --write --reg=0x54 --val=0x02