GL.iNet GL-BE9300 (Flint 3)
Status: work in progress — not yet supported by OpenWrt.
Support currently lives out of tree at
perceival/openwrt-flint3, branch flint3-be9300,
based on JiaY-shi/openwrt, branch gl-be6500,
which carries the IPQ5332 platform work. The qualcommbe/ipq53xx subtarget
is not in OpenWrt yet, so there are no official images and nothing in the
firmware selector.
Installing replaces the vendor firmware. Take a full eMMC backup first — the ART partition holds per-device radio calibration and MAC addresses that exist nowhere else.
The GL.iNet Flint 3 (GL-BE9300) is a Wi-Fi 7 router based on the Qualcomm IPQ5332, with a Realtek RTL8372N switch providing four 2.5 GbE LAN ports and an RTL8221B 2.5 GbE WAN port, plus tri-band Wi-Fi (IPQ5332 for 2.4 GHz and a dual-mac QCN9274 for 5 GHz and 6 GHz).
Hardware highlights
Supported Versions
Installation
Do not use sysupgrade from the stock GL.iNet firmware, and never
sysupgrade -F. GL's platform_check_image requires a QSDK-style FIT
with hlos/fs sections; an OpenWrt sysupgrade tar can never satisfy it,
and forcing past the check hands the image to GL's own writer, which will
misinterpret it.
1. Back up the eMMC
ssh root@192.168.8.1 'dd if=/dev/mmcblk0 bs=1M' > flint3-emmc-full.img
A whole-disk checksum will not match afterwards because the unit is live, but
the partitions that cannot change at runtime must. Compare these on-device
against the same ranges carved out of the image (sfdisk -l gives offsets):
0:SBL1, 0:QSEE, 0:DEVCFG, 0:TME, 0:CDT, 0:APPSBL,
0:ART, 0:WIFIFW, 0:HLOS.
2. Copy the image to the router
ssh root@192.168.8.1 'cat > /tmp/su.bin' < openwrt-*-glinet_gl-be9300-squashfs-sysupgrade.bin ssh root@192.168.8.1 'md5sum /tmp/su.bin'
3. Write kernel and rootfs
This replicates what OpenWrt's own emmc_upgrade_tar() does: invalidate the
kernel, write the rootfs, write the kernel, invalidate the old overlay.
ssh root@192.168.8.1 'sh -s' <<'EOF' set -e TAR=/tmp/su.bin; KERN=/dev/mmcblk0p12; ROOT=/dev/mmcblk0p13 DIR=$(tar tf "$TAR" | grep -m1 '^sysupgrade-.*/$'); DIR=${DIR%/} dd if=/dev/zero of="$KERN" bs=512 count=8; sync B=$(tar -xOf "$TAR" "$DIR/root" | dd of="$ROOT" bs=512 2>&1 | grep "records out" | cut -d' ' -f1); sync tar -xOf "$TAR" "$DIR/kernel" | dd of="$KERN" bs=512; sync dd if=/dev/zero of="$ROOT" bs=512 seek=$(( (${B%%+*} + 127) & ~127 )) count=8; sync dd if="$KERN" bs=4 count=1 | hexdump -e '4/1 "%02x"'; echo " <- want d00dfeed" dd if="$ROOT" bs=4 count=1 | hexdump -e '4/1 "%02x"'; echo " <- want 68737173 (hsqs)" EOF
Reboot only if both magic values are correct. The device then comes up as a default OpenWrt at 192.168.1.1.
Recovery
- GL.iNet U-Boot web recovery: hold the reset button while powering on, then browse to 192.168.1.1 and upload stock GL.iNet firmware. This works regardless of what is on the eMMC and is the reason the procedure above is reasonably safe.
- Or restore partitions from your own backup.
Notes for developers
- The FIT configuration node must be named
config-1(DEVICE_DTS_CONFIG := config-1). Stock U-Boot selects a FIT config by name from a built-in board table that has no AP-MI01.6 entry, so it falls back to requestingconfig-1. A board-specific name, or OpenWrt's own defaultconfig@1, givesConfig not availableand the unit will not boot from eMMC. - The four
sds0/sds1-rx/tx-swapproperties in thertl837xnode are mandatory. Without them the SoC-to-switch link still reportsLink is Up - 10Gbps/Fulland the driver probes normally, but no traffic crosses in either direction. Checkrxdesc_*in/proc/interruptsrather than link state. - TX checksum offload must be disabled on a DSA conduit: the PPE checksum engine locates L3/L4 headers with its own parser, which does not understand the 4-byte Realtek tag.
- Bridge VLAN filtering does not work with the current rtl837x driver (ports declared untagged still egress tagged). Use 802.1q sub-interfaces on the CPU port instead, e.g.
br-lancontainingwan.10plus the LAN ports. - MLO works with no patches: one
wifi-ifacelisting several radios plusoption mlo '1'and WPA3/SAE produces anap-mld0AP MLD.
Hardware
Serial
An internal header provides the console at 115200 8N1, 3.3 V. The case must be
opened to reach it. U-Boot autoboot is interrupted by sending the literal
string gl (not Ctrl-C).
Partitions
GPT on eMMC: 0:SBL1, 0:QSEE, 0:DEVCFG, 0:TME, 0:CDT,
0:APPSBLENV, 0:APPSBL, 0:ART, 0:WIFIFW, glcfg, log,
0:HLOS (kernel), rootfs.
0:ART holds per-device Wi-Fi calibration, the MAC addresses (offsets 0x4
and 0xa) and the factory regulatory country code (offset 0x88).