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:
status prints driver not present (mlan0 or /proc/mwlan/adapter0 missing) — both of which are present.
apply-wait spins 15 × 2 s and prints mlan0 did not appear within 30s, hence unit state: failed.
verify's own mlanutl mlan0 addbapara produces 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 mlanutl built against this driver, and ask them to add it to the botsu-sparrow deb. The version string to quote them:
USB8997---16.197.121.p2-MX5X16505.p7.2-(FP197), firmware 16.197.121.
(mlanutl lives in NXP's mxm_wifiex tree at mapp/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, then sh sparrow-ba-install.sh verify should read ADDBA timeout = 0. The existing udev rule + oneshot will then handle it at every boot with no reinstall.
Consider reinstalling as install monitor instead 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.