Josh Hobbs / writing
Forward-porting a frozen WiFi driver
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 API | became |
|---|---|
| per-station calls | gained an MLO link_id argument |
station_parameters | link_sta_params |
STATION_INFO_* bitmask | BIT_ULL(NL80211_STA_INFO_*) |
mgmt_frame_register callback | update_mgmt_frame_registrations |
direct dev_addr assignment | eth_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.
| check | result |
|---|---|
| cfg80211-surface files | 10 of 10 build to real MIPS objects (elf32-tradlittlemips, mips:isa32r2) |
| strict-signature rebuild | clean, with incompatible-pointer-types promoted to an error |
sparse, C=2 | 0 lock/context imbalances |
| coccicheck | 0 findings |
| checkpatch | 0 errors |
| modpost, whole driver | 198 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.