OpenWrt Mesh on Linksys WHW01: Farm Setup Guide

By tjohnson , 10 March, 2026

How We Built a Farm-Tough OpenWrt Mesh on Linksys WHW01 (Dual-Partition Flash Guide) 🚜📡

If you found this from search, this is a real-world Linksys WHW01 OpenWrt mesh tutorial from our homestead lab. We cover dual-partition flashing, reliable roaming WiFi, and how to stop stock firmware from phoning home while keeping the network stable across long farm acreage.

The Story 🌾

Around here, we needed WiFi that works like a farm tool, not a toy. We’ve got nodes spread out over rough acreage, and we needed clients to roam clean between nodes without dropping out every time someone walked from one field to another.

The stock firmware kept pulling us back toward cloud dependency, and that just wasn’t acceptable for what we’re building. We wanted local control, local reliability, and predictable behavior. That was the day we said, “Alright y’all, we’re doing this right: OpenWrt, repeatable process, and both firmware slots aligned.”

The Journey 🔧

This was not a one-click victory. We had wins, faceplants, and hard lessons:

  • We flashed images that looked fine but didn’t fully boot to usable network state.
  • We saw boot loops and confusing LED behavior.
  • We hit serial flash issues from write-size alignment.
  • We found that assumptions about host reachability can be wrong if you only test from one vantage point.

What finally worked was discipline:

  • One known-good node became the baseline.
  • We matched package parity first.
  • We used deterministic channels and roaming settings across all nodes.
  • We flashed both firmware partitions on each unit so failover stayed inside OpenWrt.

The Tutorial 🧰

Tools Needed

  • Linksys WHW01 router(s)
  • USB-to-UART serial adapter
  • Windows or Linux machine for serial + TFTP
  • Ethernet cable
  • OpenWrt-compatible WHW01 factory image
  • SSH client

Materials Needed

  • A known-good OpenWrt package baseline
  • A node config template with placeholders
  • Per-node config file (hostname, node IP, first-boot IP)
  • A verification checklist (packages, mesh neighbors, upstream tests)

Download Bundle

Step-by-Step

  1. Prepare a baseline
    Build or select one known-good OpenWrt package set for WHW01. Do not drift node-by-node; parity first, customization second.
  2. First conversion by serial + TFTP (U-Boot)
    Interrupt boot at U-Boot prompt, transfer factory image via TFTP to RAM, write both slots with aligned length, then reboot.
  3. Bring node online and apply node identity
    Set hostname and static management IP. Apply common WiFi + mesh profile (same SSID/mesh ID across nodes), then reboot and verify return.
  4. Apply parity and sync opposite slot
    Run sysupgrade from the node once it is online, then re-run so both partitions stay OpenWrt parity.
  5. Verify everything that matters
    Check package parity, wireless parity, mesh neighbors, and upstream reachability.

Working Script Example: WHW01 Dual-Slot Flash (Serial/U-Boot)

#!/usr/bin/env python3
import serial

# Placeholder values only. Fill in your own environment.
COM_PORT = "COM_PORT_HERE"
BAUD = 115200

# Known-good alignment for WHW01 dual-slot writes in this workflow.
RAM_ADDR = "0x81000000"
WRITE_LEN = "0xC60800"
SLOT_SIZE = "0x5000000"

ser = serial.Serial(COM_PORT, BAUD, timeout=0.2)

def run(cmd):
    ser.write((cmd + "\n").encode())

run("setenv ipaddr UBOOT_TEMP_IP")
run("setenv serverip TFTP_SERVER_IP")
run("setenv netmask 255.255.255.0")
run(f"tftpboot {RAM_ADDR} whw01-parity-factory.img")
run(f"nand erase 0x0 {SLOT_SIZE}")
run(f"nand write {RAM_ADDR} 0x0 {WRITE_LEN}")
run(f"nand erase {SLOT_SIZE} {SLOT_SIZE}")
run(f"nand write {RAM_ADDR} {SLOT_SIZE} {WRITE_LEN}")
run("reset")

Working Script Example: Post-Flash Node Provision

#!/usr/bin/env bash
set -euo pipefail

# source cluster.defaults.env and node.env first
# then apply hostname/ip and mesh profile consistently

uci set system.@system[0].hostname="$NODE_HOSTNAME"
uci set network.lan.ipaddr="$NODE_IP"
uci set wireless.default_radio0.ssid="$AP_SSID"
uci set wireless.default_radio1.ssid="$AP_SSID"
uci set wireless.mesh5.mesh_id="$MESH_ID"
uci set wireless.default_radio0.ieee80211r='1'
uci set wireless.default_radio1.ieee80211r='1'
uci commit system
uci commit network
uci commit wireless
service network restart
wifi reload

Working Script Example: Node Verification

#!/usr/bin/env bash
set -euo pipefail

NODE_IP="$1"
ssh root@"$NODE_IP" '
  opkg list-installed | grep -E "^wpad-openssl|^usteer|^kmod-batman-adv|^batctl-default";
  uci show wireless | grep -E "channel|txpower|airtime_mode|ieee80211r|mobility_domain";
  batctl n;
'

Tips We Learned the Hard Way

  • Keep one terminal per live flash target.
  • Verify from multiple vantage points before declaring a node down.
  • After reflashing, SSH host keys change, account for it.
  • If your transfer path assumes SFTP, make sure target supports it.
  • Keep all sensitive values in env files, not hardcoded in scripts.

Practical Farm Notes 🐓

DO

  • Do flash both partitions to OpenWrt.
  • Do lock channel plan and TX power for repeatability.
  • Do enable fast roaming and steering cluster-wide.
  • Do keep management paths local and documented.

DON’T

  • Don’t run non-aligned NAND writes on WHW01.
  • Don’t assume one failed ping equals hard failure.
  • Don’t leave one firmware slot stale.
  • Don’t publish private IP maps, hostnames, passwords, or keys.

Common Setbacks

  • Boot looked successful in one layer but never reached usable network state.
  • Serial command flow was right, but the image or write size was wrong.
  • Node was healthy, but only unreachable from one subnet vantage.

Wrap-Up 🤠

That’s the whole playbook we settled on: dual-slot first conversion, package parity, consistent mesh settings, and strict verification every step. It took some trial and error, but now it’s repeatable and solid.

If you’re building your own off-grid or farm mesh, take it slow, keep it reversible, and keep your notes clean. Y’all can absolutely do this. 🛠️🌐

Field Notes and Search Focus

We keep this guide practical for folks running real farms. The focus here is farm networking and iot deployment, with clear steps and neighbor-tested lessons from day-to-day work. 🌱

Related Topics We Cover

farm automation setup, rural network reliability, sensor deployment, camera uptime planning, off grid farm tech.

Questions Folks Ask Us

  • how to automate daily farm tasks with low cost hardware
  • best networking design for large rural properties
  • how to keep farm cameras online in harsh weather
  • step by step farm sensor network setup
  • how to scale farm tech without enterprise budgets

Related Farm Guides

FAQ

How to automate daily farm tasks with low cost hardware?

Start with a phased setup, validate in field conditions, and document maintenance as you go. That approach keeps farm networking and iot deployment reliable and easier to scale.

Best networking design for large rural properties?

Start with a phased setup, validate in field conditions, and document maintenance as you go. That approach keeps farm networking and iot deployment reliable and easier to scale.

How to keep farm cameras online in harsh weather?

Start with a phased setup, validate in field conditions, and document maintenance as you go. That approach keeps farm networking and iot deployment reliable and easier to scale.

Step by step farm sensor network setup?

Start with a phased setup, validate in field conditions, and document maintenance as you go. That approach keeps farm networking and iot deployment reliable and easier to scale.

How to scale farm tech without enterprise budgets?

Start with a phased setup, validate in field conditions, and document maintenance as you go. That approach keeps farm networking and iot deployment reliable and easier to scale.

How much should we budget before starting?

Use phased budgeting with a contingency buffer. Focus first on reliability, then optimize performance after baseline stability is proven.