Josh Hobbs / writing

Forward-porting a frozen WiFi driver

August 2026 ยท Updated September 26, 2026

September 26 checkpoint: the build workspace contains a MIPS driver module, an installable package, and an initramfs image for Linux 6.6.144, all produced on August 10. Hardware boot and working WiFi remain unverified.

The GL.iNet GL-SFT1200's vendor firmware was the starting problem: at the original August checkpoint, release 4.8.3 was built on OpenWrt 18.06 and Linux 4.14.90. Firmware updates and a newer kernel are different things. The manufacturer's release list tracks its firmware support separately from this experimental port.

The source I started from was Siflower's 1806_SDK, a vendor fork tied to kernel 4.14.90. The SF19A2890 platform and its WiFi driver needed work beyond changing a kernel version: the driver depended on interfaces that had changed or disappeared.

Keeping an older kernel means later fixes need to be backported. The aim here is to move the existing hardware onto a newer kernel without mistaking a successful compile for a usable router.

An earlier community discussion explored maintaining the older kernel. This work instead targets an OpenWrt 24.10 tree with Linux 6.6.144.

The target architecture is mipsel_24kc+24kf. The vendor driver builds as sf16a18_fmac for board codename opal. Moving it across the cfg80211/mac80211 API gap involved recurring changes like these:

4.x APIbecame
per-station callsgained an MLO link_id argument
station_parameterslink_sta_params
STATION_INFO_* bitmaskBIT_ULL(NL80211_STA_INFO_*)
mgmt_frame_register callbackupdate_mgmt_frame_registrations
direct dev_addr assignmenteth_hw_addr_set()

Patterns like these recur roughly seventy-one times in siwifi_main.c.

Patches were authored by parallel agents against a shared plan, one agent integrating; every edit is gated on LINUX_VERSION_CODE, so the 4.14 paths are preserved rather than replaced โ€” no 4.14 build has been run to confirm that.

Every row: the mainline 6.12 harness โ€” no compat layer, no Module.symvers โ€” never the 6.6.144 target.
checkresult
cfg80211-surface files10 of 10 build to real MIPS objects (elf32-tradlittlemips, mips:isa32r2)
strict-signature rebuildclean, with incompatible-pointer-types promoted to an error
sparse, C=20 lock/context imbalances
coccicheck0 findings
checkpatch0 errors
modpost, whole driver198 unresolved symbols (10 named, 188 suppressed)

The old harness reached a linked module object and then failed modpost without a kernel symbol table. It is historical evidence, not the current target-build result. The target tree now contains a real MIPS sf16a18_fmac.ko, a kmod-sf_smac_6.6.144-r1 package, and a GL-SFT1200 initramfs kernel image. Its package manifest includes the driver and kmod-cfg80211 from backports 6.12.96.

On September 26 I checked those saved artifacts, the module's architecture and dependency metadata, and the image's recorded SHA-256 checksum. The image checksum matched. The build container was stopped; this was an inspection of existing output, not a fresh rebuild.

The image recipe deliberately produces an initramfs kernel and suppresses flashable images. There is no verified hardware boot, firmware load, or WiFi traffic result in this checkpoint. The next milestone is controlled hardware bring-up: boot, load the driver and its dependencies, then test the radios. The build artifacts are a step toward that, not a finished firmware release.