GL-MT6000 CSI firmware pre-flight: six checks before the first flash

By Wu Jun · Updated 2026-10-29 · GL-MT6000, MT7986, OpenWrt, firmware verification, sysupgrade, Wi-Fi CSI, rollback · 7 min read

A router image can boot and still be wrong for the experiment. It may target the wrong board, contain the wrong Wi-Fi firmware, lack a CSI symbol, omit the daemon, or leave no known-good rollback file. This article records the six checks made before the first GL-MT6000 CSI flash on 2026-10-10.

Evidence grade E for measurements of this build. The exact image is not distributed by this site; use the commands below to inspect the image you built yourself. A pre-flight check proves artifact provenance and component presence. It does not prove that firmware emits CSI at runtime. Runtime evidence is the separate 10-minute capture published with the dataset [1] [2].

The verified artifact set

Item Verified value
Target glinet_gl-mt6000
Kernel 6.18.36
OpenWrt CSI branch tip aed26e5f95963cd725d9ff097c713af8c24afd35 [3]
mt76 pin 59676919ea408b0b13a9d23f2e2e1a1ab407fba1
sysupgrade container GNU tar with CONTROL, kernel, root
sysupgrade bytes 12,677,432
sysupgrade SHA-256 3226cde7201c43f2c015d1be035888bc269cc98070f678a03b1a185ca6c4defe
stock rollback bytes 83,146,618
stock rollback SHA-256 4004632eaf516fd2844be0e5595b6e4171d243181ff49b81569b986c79007dae
Wi-Fi firmware bytes 2,229,264
Wi-Fi firmware MD5 3ce21edabe201608e7bec0dd16898019
Wi-Fi firmware SHA-256 86baa5bcb05436c23ac443dd937cbb6d8cc9920eab6fd86bc4421038f526a03a
firmware build string ____00000020260515120459

The stock rollback came from GL.iNet's official GL-MT6000 download entry [4]. The hash above belongs only to the exact downloaded file used in this experiment. Downloading the same version later is not enough: recompute the hash on the new file before trusting it.

Check 1: verify the outer image and board target

The .bin name is not evidence. Open the container and inspect its members:

IMG=openwrt-mediatek-filogic-glinet_gl-mt6000-squashfs-sysupgrade.bin

shasum -a 256 "$IMG"
# expected for this build:
# 3226cde7201c43f2c015d1be035888bc269cc98070f678a03b1a185ca6c4defe

tar -tf "$IMG"
# sysupgrade-glinet_gl-mt6000/
# sysupgrade-glinet_gl-mt6000/CONTROL
# sysupgrade-glinet_gl-mt6000/kernel
# sysupgrade-glinet_gl-mt6000/root

tar -xOf "$IMG" sysupgrade-glinet_gl-mt6000/CONTROL
# BOARD=glinet_gl-mt6000

This check catches three different failures:

  1. a file changed after the build test;
  2. a factory or unrelated image was placed under a sysupgrade filename;
  3. the image targets another GL.iNet or OpenWrt board.

The hash identifies the artifact. It does not create trust by itself. Record where the build came from and compare this file with the output of that trusted build.

Check 2: keep a rollback image with its own hash

The rollback file is not a filename kept “somewhere on the desktop”. It is a tested artifact with an identity:

shasum -a 256 mt6000-4.11.0_release3.bin
# expected:
# 4004632eaf516fd2844be0e5595b6e4171d243181ff49b81569b986c79007dae

This stock image was 83,146,618 bytes. Store it outside the router, include the hash in the experiment record, and verify it again while the recovery computer is connected by Ethernet. The GL-MT6000 U-Boot recovery page is reached at 192.168.1.1; the recovery rehearsal itself must be completed in the flashing window because it requires a physical reset.

The pre-flight did not publish or redistribute the vendor binary. The official download page remains the source, and the local hash ties the recovery plan to the exact vendor file tested here.

Check 3: identify the Wi-Fi firmware twice

The MT7986 Wi-Fi firmware is separate from the OpenWrt kernel and root filesystem. The known working shape for this experiment was the 2026-05-15 build:

md5sum mt7986_wm.bin
# 3ce21edabe201608e7bec0dd16898019

sha256sum mt7986_wm.bin
# 86baa5bcb05436c23ac443dd937cbb6d8cc9920eab6fd86bc4421038f526a03a

strings mt7986_wm.bin | grep -o '_[_0-9]*20260515120459' | head
# ____00000020260515120459

Why keep an MD5 value that is not a modern security hash? Because the MediaTek firmware ecosystem and the CSI project use 3ce21eda… as a compact build identifier. MD5 is useful here for exact-build identification, not for deciding whether a download is safe. SHA-256 is the stronger integrity value.

The important sequence is:

  1. calculate the hash of the firmware in the build output;
  2. extract the sysupgrade root filesystem;
  3. calculate the hash of /lib/firmware/mediatek/mt7986_wm.bin inside that root filesystem;
  4. require the two values to match before flashing.

Checking only the file in the build directory can miss a failed package copy or a different firmware being installed into the image.

Check 4: prove the CSI code reached the kernel module

The image contained mt7915e.ko, but the filename alone does not tell us whether the CSI path was compiled in. The verification searched for implementation-specific strings:

strings mt7915e.ko | grep -E \
  'mt7915_vendor_csi_ctrl|mt7915_vendor_csi_ctrl_dump|mt7915_get_csi_stats|csi_stats|data_i|data_q'

Observed symbols included:

MTK_VENDOR_ATTR_CSI_DATA_I
MTK_VENDOR_ATTR_CSI_DATA_INFO
MTK_VENDOR_ATTR_CSI_DATA_Q
csi_stats
mt7915_get_csi_stats
mt7915_vendor_csi_ctrl
mt7915_vendor_csi_ctrl_dump

That is stronger than checking package names. It shows that CSI control, dump and data fields exist inside the kernel module that will load on the router. It still does not prove the firmware returns a CSI event. The driver and firmware are separate layers; this is the central distinction between pre-flight evidence and runtime evidence.

The driver source is the upstream mt76 tree with the CSI changes layered on top [5]. The exact community branch and commit are pinned above so the check can be repeated [3].

Check 5: verify userspace and autostart

CSI capture also needs a control utility and a daemon. The image root contained:

/usr/sbin/mt76-vendor
/usr/sbin/mt76-csi-daemon
/etc/init.d/mt76-csi
/etc/mt76-csi.conf
/etc/rc.d/S95mt76-csi
/etc/rc.d/K10mt76-csi

The two rc.d links matter because a binary that exists but never starts is not a working image. After flashing, verify the package state and service separately:

apk info -e mt76-vendor mt76-csi-daemon luci-app-csi
/etc/init.d/mt76-csi enabled && echo enabled
lsmod | grep -E 'mt7915e|mt76'
find /sys/kernel/debug -name csi_stats

Do not infer frame production from a successful service start. The next gate is a received UDP record with the expected 256-subcarrier shape and chain_info grouping.

Check 6: pin package versions in the manifest

The relevant installed package lines were:

kmod-mt7915e - 6.18.36.2026.07.01~59676919-r100
kmod-mt7986-firmware - 6.18.36.2026.07.01~59676919-r100
mt7986-wo-firmware - 20260622-r1
mt76-vendor - 1
mt76-csi-daemon - 1.0.0-r3
luci-app-csi - 0.260905.03384

These names and versions let another researcher compare a different build without reducing the whole stack to “I used OpenWrt”. The kernel package version also exposes the mt76 pin embedded in the package release.

What passed, and what did not

Passed before flashing:

Not proven before flashing:

Those questions require the physical device. They are why the project later published raw records, the 10-minute checksum, the timing audit and the Wi-Fi slowdown experiments rather than stopping at “the image contains CSI code”.

Flash-day order

The safe order used here was:

  1. rehearse entry into U-Boot recovery without uploading a file;
  2. verify the stock rollback hash again;
  3. disconnect WAN and use only a wired LAN link to the computer;
  4. flash the sysupgrade image without keeping the previous configuration;
  5. reach the temporary LAN address and move it off the upstream subnet before reconnecting WAN;
  6. verify the Wi-Fi firmware, module, service, debugfs node and UDP output;
  7. keep the rollback image available until CSI capture and normal Wi-Fi operation both pass.

Disconnecting WAN is not optional when the router and upstream gateway both use the same 192.168.1.1/24 network. The first boot address can collide with the home gateway and create a misleading “flashing failed” diagnosis.

Download the sanitized pre-flight record

The record intentionally omits internal IP addresses, usernames, local filesystem paths and the firmware binary itself. It keeps the values needed to compare a build without exposing the lab network.

References and data sources

Every external claim carries a source and an evidence grade (grading scheme). Grade E marks first-party, reproducible measurements from this project.

  1. Grade E · first-party measurement This project's 10-minute raw capture (57,293 records / 600.0 s, SHA-256 00373f83…95e2)
    Router CSI Lab · 2026
    okwujun.pw/en/datasets/ · verified: Reassembled chunks verified byte-identical (2026-10-11) · The local raw master has SHA-256 00373f83…95e2; the public de-identified derivative has SHA-256 527466ce…a440. They must not be confused.
  2. Grade E · first-party measurement Router CSI Lab — GL-MT6000 (MT7986) Wi-Fi CSI dataset, 10 s sample + 10 min capture
    Router CSI Lab · 2026
    doi:10.5281/zenodo.23434789 · verified: CC BY 4.0; SHA-256 published; Zenodo DOI 10.5281/zenodo.23434789 · The dataset has a Zenodo DOI (10.5281/zenodo.23434789) and can be cited directly.
  3. Grade D · preprint/wiki ossiemarks/openwrt — feature/csi-mt7915 CSI stack
    ossiemarks
    github.com/ossiemarks/openwrt/commit/aed26e5f95963cd725d9ff097c713af8c24afd35 · verified: Public commit page fetched 2026-10-29; community project, not peer-reviewed. · Community OpenWrt CSI branch used for this build. Its existence does not prove MT7986 capture; that claim needs the first-party capture measured here.
  4. Grade C · official docs GL.iNet download center — GL-MT6000 firmware
    GL.iNet
    dl.gl-inet.com/router/mt6000/stable · verified: Official download page fetched 2026-10-29; used only to establish the vendor rollback source, not to claim a checksum without a downloaded file. · Official GL-MT6000 firmware entry point. Always recompute the hash on the downloaded file.
  5. Grade C · official docs openwrt/mt76 — mac80211 driver for MediaTek Wi-Fi chipsets
    OpenWrt project / MediaTek
    github.com/openwrt/mt76 · verified: GitHub API 2026-10-11 (stars 890, last push 2026-10-08) · Upstream of the open-source mt76 driver used here; the CSI patch is applied on top of this codebase.