Hi Luke,
Sorry for the late response. When I ran the verification after installing and power cycling, I got this:
unit enabled : static
unit state : failed
[up=112s] driver not present (mlan0 or /proc/mwlan/adapter0 missing)
RESULT: NOT ACTIVE -- ADDBA timeout reads '<unreadable>', expected 0
It seems like it is because my system is missing mlanutl. Claude thinks there is a specific of version of that program that I might need. If you know the version, I can build it or if you wanted to sent the binary that would work too, whichever is easier. Here is claude's full summary in case it helps:
I read the bundle and ran read-only checks against the drone (no changes made). The install is fine — the problem is a missing dependency the script never names.
What's actually wrong
mlanutl does not exist on this board. Nothing else is broken.
On 10.3.1.82 right now:
| check | result |
|---|---|
mlan0 |
up, holds 10.3.1.82/16 — you are SSH'd in over it |
/proc/mwlan/adapter0 |
present (config, mlan0/, uap0/) |
lsmod |
usbxxx + mlan loaded, USB dev 1286:204e (post-firmware, normal) |
mlan0 registered at |
uptime 7.9 s, associated at 11.4 s |
find / -name mlanutl* |
nothing — not in /usr/sbin, not in any package |
The botsu-sparrow 1.0.8-r0 deb ships 9 files (2 .ko, 6 firmware blobs, sparrow.conf) and no userspace tools; ModalAI's voxl2-wlan doesn't provide mlanutl either. Their bench board has it, yours never did.
Why that produces those two misleading messages
sparrow-ba-fix.sh:53 —
have_driver() {
[ -d "$ADAP" ] || return 1
[ -x "$MLANUTL" ] || return 1 # <-- fails here
ip link show "$IFACE" >/dev/null 2>&1 || return 1
}
MLANUTL falls back to /usr/sbin/mlanutl, which doesn't exist, so have_driver returns false while the driver is perfectly healthy. Every caller then lies:
statusprintsdriver not present (mlan0 or /proc/mwlan/adapter0 missing)— both of which are present.apply-waitspins 15 × 2 s and printsmlan0 did not appear within 30s, henceunit state: failed.verify's ownmlanutl mlan0 addbaparaproduces nothing →'<unreadable>'.
The journal confirms the wiring works: udev fired on mlan0 creation and started the unit at up=8 s (matching the 7.9 s dmesg line), and it died at up=38 s — exactly the 30 s loop. (The journal's wall clocks look 13 min apart because the VOXL2 has no RTC and the clock jumps once the network syncs; trust the up= numbers.) unit enabled: static is also expected — the unit has no [Install] section on purpose; udev starts it.
Meanwhile the crash trigger is live and unmitigated — /proc/mwlan/adapter0/mlan0/debug shows BA streams on tid 0 and tid 4, win_size 64, at the default 65535 TU timeout.
What to change
- Ask ModalAI for an aarch64
mlanutlbuilt against this driver, and ask them to add it to thebotsu-sparrowdeb. The version string to quote them:
USB8997---16.197.121.p2-MX5X16505.p7.2-(FP197), firmware 16.197.121.
(mlanutllives in NXP'smxm_wifiextree atmapp/mlanutl— buildable yourself, but it drives private ioctls whose subcommand numbering tracks the driver release, so ask which release the sparrow build came from rather than grabbing an arbitrary tag.) - Drop it at
/usr/sbin/mlanutl,chmod 755. Then no power cycle is needed — it's a runtime ioctl:sh /usr/sbin/sparrow-ba-fix.sh apply, thensh sparrow-ba-install.sh verifyshould readADDBA timeout = 0. The existing udev rule + oneshot will then handle it at every boot with no reinstall. - Consider reinstalling as
install monitorinstead of oneshot — the setting is runtime-only and silently reverts on a module reload or warm reset, which is exactly the situation you're in after a wifi wedge.
Two things worth sending back to ModalAI with the request: the deb ships no mlanutl, and have_driver() conflates "tool missing" with "driver missing" — that's what sent you looking at the power cycle instead of the toolchain. Same as the region_code note, it's a packaging gap on their side.
Also note robot/setup/copy.sh runs this installer on every drone you provision, so all of them will fail verify identically until mlanutl is in the image.