Huasifei ws1610

m2 for 5g moudle not show up on my openwrt build

Any progress on this? I bought the same router.

If you can give dump for some partion i will back to work
My device you can send me mail

[Admin edit: email removed. Please use PMs to coordinate]

I have a semi working OpenWrt snapshot for WS1610. I have fixed most of the dts
5G modem works, Wifi works, 1G Lan port works.

However the 2.5G LAN/WAN port RTL8221 is a b*tch. The stock firmware seems to use some out of tree “glue” to make it work and right now I haven’t been able to figure it out.

If anybody else is interested in working on this device I can push my stuff to git so others can take a look.

Well seems like I fixed that last issue too

Been running Openwrt on this router for 2 weeks now and it has been stable. I fixed my PR and all of the test passed. I’d be glad if anybody else would like to test on their device / review the PR so it could be merged.

great work

The device with OpenWrt has been keeping my HA instance accessable at my summer cottage over the winter without issues.

I am attaching my latest personal build here in case anyone wants to try.

This has baked in custom repo from:
https://github.com/4IceG/Modem-extras-apk

Included packages:

WiFi is also enabled on first boot.

Flashing instructions can be found in my PR. Unfortunately it has not been merged yet.

Update, do not use these builds as they are outdated, because I pushed a newer PR that changed the partition layout

wifi only 80mhz

I have a fully debuged custom build that ill post for whoever wants on my github soon. I used georges build as the platform and added a bunch of qualcomm modem tools, multiple vpn support, xray, terminal+at terminal, 464xlat, and a few other bits. Tried to get pcie working but it appears these boards didnt connect the lanes for m2

Glad to see more devs/users of this device here.
@Typhon999 I had a comment about the pcie being disabled and not routed in the dts, but I was asked to remove it as it was “redundant”.

Meanwhile I think I have figured out A/B partition flashing support together with some easier commands to flash from stock firmware. I will push that some time later when I am confident that it works reliably.

https://github.com/Typhon999?tab=repositories its not public

It's public here, just empty.

̶M̶y̶ ̶b̶r̶a̶n̶c̶h̶ ̶n̶o̶w̶ ̶s̶u̶p̶p̶o̶r̶t̶s̶ ̶A̶/̶B̶ ̶f̶l̶a̶s̶h̶i̶n̶g̶/̶u̶p̶d̶a̶t̶i̶n̶g̶

Update log

root@OpenWrt:~# Watchdog handover: fd=3

  • watchdog -
    Watchdog does not have CARDRESET support
    Sat May 16 19:30:54 EEST 2026 upgrade: Sending TERM to remaining processes ...
    Sat May 16 19:30:54 EEST 2026 upgrade: Sending signal TERM to hostapd (1689)
    Sat May 16 19:30:54 EEST 2026 upgrade: Sending signal TERM to hostapd (1733)
    [ 1611.414883] mt798x-wmac 18000000.wifi phy0-ap0: left allmulticast mode
    [ 1611.421436] mt798x-wmac 18000000.wifi phy0-ap0: left promiscuous mode
    [ 1611.427949] br-lan: port 2(phy0-ap0) entered disabled state
    [ 1612.404794] mt798x-wmac 18000000.wifi phy1-ap0: left allmulticast mode
    [ 1612.411400] mt798x-wmac 18000000.wifi phy1-ap0: left promiscuous mode
    [ 1612.417942] br-lan: port 3(phy1-ap0) entered disabled state
    Sat May 16 19:30:58 EEST 2026 upgrade: Sending KILL to remaining processes ...
    [ 1621.369074] stage2 (7815): drop_caches: 3
    Sat May 16 19:31:05 EEST 2026 upgrade: Switching to ramdisk...
    [ 1622.732837] UBIFS (ubi0:2): background thread "ubifs_bgt0_2" stops
    [ 1622.746840] UBIFS (ubi0:2): un-mount UBI device 0
    Sat May 16 16:31:06 UTC 2026 upgrade: Performing system upgrade...
    Dumping woem ...
    Current slot: ubi2
    Upgrading inactive slot: ubi
    verifying sysupgrade tar file integrity
    [ 1623.370210] block ubiblock0_1: released
    Volume ID 0, size 36 LEBs (4571136 bytes, 4.3 MiB), LEB size 126976 bytes (124.0 KiB), dynamic, name "kernel", alignment 1
    [ 1623.875990] block ubiblock0_1: created from ubi0:1(rootfs)
    Volume ID 1, size 69 LEBs (8761344 bytes, 8.3 MiB), LEB size 126976 bytes (124.0 KiB), dynamic, name "rootfs", alignment 1
    Set volume size to 94851072
    Volume ID 2, size 747 LEBs (94851072 bytes, 90.4 MiB), LEB size 126976 bytes (124.0 KiB), dynamic, name "rootfs_data", alignment 1
    [ 1627.331365] UBIFS (ubi0:2): default file-system created
    [ 1627.336966] UBIFS (ubi0:2): Mounting in unauthenticated mode
    [ 1627.342744] UBIFS (ubi0:2): background thread "ubifs_bgt0_2" started, PID 8647
    [ 1627.385794] UBIFS (ubi0:2): UBIFS: mounted UBI device 0, volume 2, name "rootfs_data"
    [ 1627.393664] UBIFS (ubi0:2): LEB size: 126976 bytes (124 KiB), min./max. I/O unit sizes: 2048 bytes/2048 bytes
    [ 1627.403573] UBIFS (ubi0:2): FS size: 93454336 bytes (89 MiB, 736 LEBs), max 747 LEBs, journal size 4698112 bytes (4 MiB, 37 LEBs)
    [ 1627.415217] UBIFS (ubi0:2): reserved for root: 4414078 bytes (4310 KiB)
    [ 1627.421831] UBIFS (ubi0:2): media format: w5/r0 (latest is w5/r0), UUID 133A7C70-B6C8-432A-B8C8-486129ABCDE5, small LPT model
    [ 1627.446212] UBIFS (ubi0:2): un-mount UBI device 0
    [ 1627.450965] UBIFS (ubi0:2): background thread "ubifs_bgt0_2" stops
    configuration saved
    Dumping woem ...
    Unlocking woem ...

Writing from /tmp/ws1610-woem.7815.bin to woem ...
sysupgrade successful
umount: can't unmount /dev: Resource busy
umoun[ 1627.523532] reboot: Restarting system
t: can't unmount
F0: 102B 0000
FA: 1040 0000
FA: 1040 0000 [0200]
F9: 0000 0000
V0: 0000 0000 [0001]
00: 0000 0000
BP: 2400 0041 [0000]
G0: 1190 0000
EC: 0000 0000 [1000]
T0: 0000 024B [010F]
Jump to BL

NOTICE: BL2: v2.7(release):dd71bc3c
NOTICE: BL2: Built : 11:43:41, Jun 30 2024
NOTICE: WDT: disabled
NOTICE: EMI: Using DDR4 settings

dump toprgu registers data:
1001c000 | 00000000 0000ffe0 00000000 00000000
1001c010 | 00000fff 00000000 00f00000 00000000
1001c020 | 00000000 00000000 00000000 00000000
1001c030 | 003c0003 003c0003 00000000 00000000
1001c040 | 00000000 00000000 00000000 00000000
1001c050 | 00000000 00000000 00000000 00000000
1001c060 | 00000000 00000000 00000000 00000000
1001c070 | 00000000 00000000 00000000 00000000
1001c080 | 00000000 00000000 00000000 00000000

dump drm registers data:
1001d000 | 00000000 00000000 00000000 00000000
1001d010 | 00000000 00000000 00000000 00000000
1001d020 | 00000000 00000000 00000000 00000000
1001d030 | 00a003f1 000000ff 00100000 00000000
1001d040 | 00027e71 000200a0 00020303 000000ff
1001d050 | 00000000 00000000 00000000 00000000
1001d060 | 00000002 00000000 00000000 00000000
drm: 500 = 0xc
[DDR Reserve] ddr reserve mode not be enabled yet
DDR RESERVE Success 0
[EMI] ComboMCP not ready, using default setting
BYTE_swap:0
BYTE_swap:0
Window Sum 552, worse bit 1, min window 64
Window Sum 536, worse bit 8, min window 64
[TxChooseVref] Worse bit 15, Min win 22, Win sum 412, Final Vref 40
Window Sum 236, worse bit 3, min window 22
Window Sum 180, worse bit 11, min window 12
Window Sum 254, worse bit 3, min window 26
Window Sum 216, worse bit 11, min window 20
Window Sum 294, worse bit 3, min window 32
Window Sum 262, worse bit 11, min window 24
Window Sum 318, worse bit 3, min window 36
Window Sum 294, worse bit 10, min window 34
Window Sum 328, worse bit 1, min window 38
Window Sum 302, worse bit 9, min window 36
Window Sum 346, worse bit 3, min window 40
Window Sum 328, worse bit 10, min window 36
Window Sum 364, worse bit 1, min window 42
Window Sum 342, worse bit 11, min window 40
Window Sum 374, worse bit 1, min window 44
Window Sum 350, worse bit 8, min window 42
Window Sum 392, worse bit 1, min window 46
Window Sum 372, worse bit 10, min window 44
Window Sum 402, worse bit 1, min window 48
Window Sum 382, worse bit 9, min window 46
Window Sum 410, worse bit 1, min window 48
Window Sum 398, worse bit 8, min window 48
Window Sum 426, worse bit 1, min window 50
Window Sum 404, worse bit 10, min window 48
Window Sum 428, worse bit 3, min window 50
Window Sum 422, worse bit 10, min window 50
Window Sum 442, worse bit 3, min window 52
Window Sum 430, worse bit 10, min window 52
Window Sum 448, worse bit 1, min window 54
Window Sum 440, worse bit 10, min window 52
Window Sum 460, worse bit 1, min window 56
Window Sum 450, worse bit 10, min window 54
Window Sum 464, worse bit 1, min window 56
Window Sum 474, worse bit 1, min window 56
Window Sum 464, worse bit 10, min window 56
Window Sum 480, worse bit 1, min window 58
NOTICE: EMI: Detected DRAM size: 1024MB
NOTICE: EMI: complex R/W mem test passed
NOTICE: CPU: MT7981 (1300MHz)
NOTICE: SPI_NAND parses attributes from parameter page.
NOTICE: SPI_NAND Detected ID 0xef
NOTICE: Page size 2048, Block size 131072, size 268435456
NOTICE: Initializing NMBM ...
NOTICE: Signature found at block 2047 [0x0ffe0000]
NOTICE: First info table with writecount 0 found in block 1920
NOTICE: Second info table with writecount 0 found in block 1923
NOTICE: NMBM has been successfully attached in read-only mode
NOTICE: BL2: Booting BL31
NOTICE: BL31: v2.7(release):dd71bc3c
NOTICE: BL31: Built : 11:43:45, Jun 30 2024
NOTICE: Hello BL31!!!

U-Boot 2022.07-rc3 (Jun 30 2024 - 11:43:05 +0800)

CPU: MediaTek MT7981
Model: mt7981-rfb
DRAM: 1 GiB
Core: 36 devices, 16 uclasses, devicetree: embed

Initializing NMBM ...
spi-nand: spi_nand spi_nand@0: Winbond SPI NAND was found.
spi-nand: spi_nand spi_nand@0: 256 MiB, block size: 128 KiB, page size: 2048, OOB size: 128
Could not find a valid device for nmbm0
Signature found at block 2047 [0x0ffe0000]
First info table with writecount 0 found in block 1920
Second info table with writecount 0 found in block 1923
NMBM has been successfully attached

Loading Environment from MTD... *** Warning - bad CRC, using default environment

In: serial@11002000
Out: serial@11002000
Err: serial@11002000
Net: Could not get PHY for ethernet@15100000: addr 1
No ethernet found.

mdio_register: non unique device name 'ethernet@15100000'
mdio_register: non unique device name 'ethernet@15100000'

*** U-Boot Boot Menu ***

  1. Startup system (Default)
  2. Upgrade firmware
  3. Upgrade ATF BL2
  4. Upgrade ATF FIP
  5. Upgrade single image
  6. Load image
  0. U-Boot console

Press UP/DOWN to move, ENTER to select, ESC/CTRL+C to quit

Reading from 0x0 to 0x7ffd44f8, size 0x10000 ... OK
boot from ubi
ubi0: attaching mtd7
ubi0: scanning is finished
ubi0: attached mtd7 (name "ubi", size 112 MiB)
ubi0: PEB size: 131072 bytes (128 KiB), LEB size: 126976 bytes
ubi0: min./max. I/O unit sizes: 2048/2048, sub-page size 2048
ubi0: VID header offset: 2048 (aligned 2048), data offset: 4096
ubi0: good PEBs: 896, bad PEBs: 0, corrupted PEBs: 0
ubi0: user volume: 3, internal volumes: 1, max. volumes count: 128
ubi0: max/mean erase counter: 2/1, WL threshold: 4096, image sequence number: 1778944316
ubi0: available PEBs: 2, total reserved PEBs: 894, PEBs reserved for bad PEB handling: 38
Reading from volume 'kernel' to 0x46000000, size 0x0 ... OK

Loading kernel from FIT Image at 46000000 ...

Update 19.07.26 : I’ve replaced the earlier vendor A/B implementation in PR #24274 with an all-in-UBI layout.

The A/B flashing mostly worked, but the bootloader didn’t tell Linux which slot it had selected. Supporting that safely would require device-specific kernel or initramfs logic.

The new layout uses OpenWrt U-Boot with a single UBI partition that maximises available space and has working TFTP recovery. It’s simpler, more maintainable and free from vendor setup constraints

This router has an internal 4pin fan port, that from factory is left unused. Its not defined by the factory dts. I figured out the pin mapping and enabled it. I also swapped the fan on my unit so it can be quiet and not run the fan at 100% all the time.

I have created a personal branch with CI that builds a automatic transition image that can be flashed from original FW. Taking a backup beforehand is neccesary, in case something goes wrong.

That said the device is pretty much unbrickable as long:

  • It's not physically damaged
  • You have a valid Factory partition backup
  • access to uart adapter and PC with mtk_uartboot installed

I have tested it few times without falt and included some logs in the /docs folder

Install guide is here and files available under releases

wan not work lasest build

expect if you change lan to wan and no led

I think the realtek driver in main was broken at some point. On some builds it has worked. On some it doesn't

Edit:

On current builds wan port works fine, it just has to be added to the br-lan group. By default it is configured as wan

The WS1610 original fan is permanently powerd from the 5v and GND from the uart port. The device however has unused 4-pin fan header: (GND, TACH, PWM, 5V). I mapped out the port by my self. It wasn't even defined in the original DTS. Idk why they cheaped out on that.

I swapped out the fan and created an pwm fan control app. The app has been tested with ws1610, h5000m and beryl7. It should work on any OpenWRT router that has a built in fan and that pulls in "kmod-hwmon-pwmfan" package by default. The app can be installed from my CI build repo shared below.

  • I using this theme when taking the screenshots.

You should post this in the community builds sub forum.