OpenWrt support for Zyxel PMG5617GA and Econet SoCs, first GPON support !?

The chip says EN7528.

Can you try loading the initramfs image for en7528 via xmdm command in bootloader (see steps here) . en7528 and en7580 are very similar ( both are little endian 1004Kc) SoCs except some peripherals. @cjd can comment more on this

I don’t know how similar the 28 and the 80 are, the 80 has airoha_eth network subsystem (the 10gb ethernet) and the 28 has the EN751627 eth (econet_eth / 1gb), but I don’t know more than that. It’s encouraging to see a 7580 bootloader running on a 7528 chip though…

1 Like

I’m in. The xmodem transfer took about 10 minutes, but it booted. I have an openwrt shell.

Great. Please share the bootlog

EN7528GT actually en7580 it seems. see this

1 Like

from the jump:

bldr> jump 80020000
Jump to 80020000
zimage at:     80023390 8060C7F4
Uncompressing Linux at load address 81000000
Copy device tree to address  82716760
Now, booting the kernel...
[    0.000000] Linux version 6.12.62 (runner@runnervmh13bl) (mipsel-openwrt-linux-musl-gcc (OpenWrt GCC 14.3.0 r32426-b817fb8e07) 14.3.0, GNU ld (GNU Binutils) 2.44) #0 SMP Fri Jan  2 11:16:09 2026
[    0.000000] printk: legacy bootconsole [early0] enabled
[    0.000000] CPU0 revision is: 0001a12c (MIPS interAptiv (multi))
[    0.000000] MIPS: machine is Generic EN7528
[    0.000000] Initrd not found or empty - disabling initrd
[    0.000000] OF: reserved mem: Reserved memory: No reserved-memory node in the DT
[    0.000000] VPE topology {2,2} total 4
[    0.000000] Primary instruction cache 32kB, VIPT, 4-way, linesize 32 bytes.
[    0.000000] Primary data cache 32kB, 4-way, PIPT, no aliases, linesize 32 bytes
[    0.000000] MIPS secondary cache 512kB, 8-way, linesize 32 bytes.
[    0.000000] Zone ranges:
[    0.000000]   Normal   [mem 0x0000000000000000-0x0000000003ffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000000000000-0x0000000003ffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x0000000003ffffff]
[    0.000000] percpu: Embedded 12 pages/cpu s18256 r8192 d22704 u49152
[    0.000000] Kernel command line:
[    0.000000] Dentry cache hash table entries: 8192 (order: 3, 32768 bytes, linear)
[    0.000000] Inode-cache hash table entries: 4096 (order: 2, 16384 bytes, linear)
[    0.000000] Writing ErrCtl register=00000000
[    0.000000] Readback ErrCtl register=00000000
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 16384
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[    0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
[    0.000000] rcu: Hierarchical RCU implementation.
[    0.000000] Tracing variant of Tasks RCU enabled.
[    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies.
[    0.000000] RCU Tasks Trace: Setting shift to 2 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=4.
[    0.000000] NR_IRQS: 256
[    0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention.
[    0.000000] clocksource: timer: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 9556302233 ns
[    0.000004] sched_clock: 32 bits at 200MHz, resolution 5ns, wraps every 10737418237ns
[    0.008516] timer: using 200.000 MHz high precision timer (separate IRQ mode)
[    0.016524] Calibrating delay loop... 864.25 BogoMIPS (lpj=4321280)
[    0.063300] pid_max: default: 32768 minimum: 301
[    0.075424] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.083386] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.099243] rcu: Hierarchical SRCU implementation.
[    0.104473] rcu: Max phase no-delay instances is 1000.
[    0.111006] smp: Bringing up secondary CPUs ...
[    0.116615] Primary instruction cache 32kB, VIPT, 4-way, linesize 32 bytes.
[    0.116635] Primary data cache 32kB, 4-way, PIPT, no aliases, linesize 32 bytes
[    0.116649] MIPS secondary cache 512kB, 8-way, linesize 32 bytes.
[    0.116690] CPU1 revision is: 0001a12c (MIPS interAptiv (multi))
[    0.157710] Primary instruction cache 32kB, VIPT, 4-way, linesize 32 bytes.
[    0.157724] Primary data cache 32kB, 4-way, PIPT, no aliases, linesize 32 bytes
[    0.157734] MIPS secondary cache 512kB, 8-way, linesize 32 bytes.
[    0.157754] CPU2 revision is: 0001a12c (MIPS interAptiv (multi))
[    0.197583] Primary instruction cache 32kB, VIPT, 4-way, linesize 32 bytes.
[    0.197596] Primary data cache 32kB, 4-way, PIPT, no aliases, linesize 32 bytes
[    0.197606] MIPS secondary cache 512kB, 8-way, linesize 32 bytes.
[    0.197628] CPU3 revision is: 0001a12c (MIPS interAptiv (multi))
[    0.237008] smp: Brought up 1 node, 4 CPUs
[    0.328894] Memory: 38688K/65536K available (7478K kernel code, 630K rwdata, 1452K rodata, 15136K init, 227K bss, 25788K reserved, 0K cma-reserved)
[    0.345568] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.356348] futex hash table entries: 1024 (order: 3, 32768 bytes, linear)
[    0.369930] NET: Registered PF_NETLINK/PF_ROUTE protocol family
[    0.384817] clocksource: Switched to clocksource timer
[    0.397329] NET: Registered PF_INET protocol family
[    0.402765] IP idents hash table entries: 2048 (order: 2, 16384 bytes, linear)
[    0.411197] tcp_listen_portaddr_hash hash table entries: 512 (order: 0, 4096 bytes, linear)
[    0.420317] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
[    0.428805] TCP established hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.437225] TCP bind hash table entries: 1024 (order: 2, 16384 bytes, linear)
[    0.445101] TCP: Hash tables configured (established 1024 bind 1024)
[    0.452679] MPTCP token hash table entries: 256 (order: 0, 4096 bytes, linear)
[    0.460765] UDP hash table entries: 256 (order: 1, 8192 bytes, linear)
[    0.467893] UDP-Lite hash table entries: 256 (order: 1, 8192 bytes, linear)
[    0.476186] NET: Registered PF_UNIX/PF_LOCAL protocol family
[    0.485173] workingset: timestamp_bits=14 max_order=14 bucket_order=0
[    0.495230] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[    0.504102] Serial: 8250/16550 driver, 2 ports, IRQ sharing disabled
[    0.513119] printk: legacy console [ttyS0] disabled
[    0.519361] 1fbf0000.serial: ttyS0 at MMIO 0x1fbf0000 (irq = 20, base_baud = 460800) is a Airoha 16550
[    0.529761] printk: legacy console [ttyS0] enabled
[    0.529761] printk: legacy console [ttyS0] enabled
[    0.539883] printk: legacy bootconsole [early0] disabled
[    0.539883] printk: legacy bootconsole [early0] disabled
[    0.557208] spi-nand spi0.0: Macronix SPI NAND was found.
[    0.562667] spi-nand spi0.0: 512 MiB, block size: 256 KiB, page size: 4096, OOB size: 128
[    0.658804] 3 fixed-partitions partitions found on MTD device spi0.0
[    0.665248] Creating 3 MTD partitions on "spi0.0":
[    0.670055] 0x000000000000-0x000040000000 : "all_flash"
[    0.675295] mtd: partition "all_flash" extends beyond the end of device "spi0.0" -- size truncated to 0x20000000
[    1.784404] 0x000000000000-0x000000400000 : "bootloader"
[    1.790358] 0x000000400000-0x000040400000 : "rest_of_flash"
[    1.795966] mtd: partition "rest_of_flash" extends beyond the end of device "spi0.0" -- size truncated to 0x1fc00000
[    1.811274] NET: Registered PF_INET6 protocol family
[    1.818445] Segment Routing with IPv6
[    1.822215] In-situ OAM (IOAM) with IPv6
[    1.826265] NET: Registered PF_PACKET protocol family
[    1.831349] 8021q: 802.1Q VLAN Support v1.8
[    1.853218] clk: Disabling unused clocks
[    1.899772] Freeing unused kernel image (initmem) memory: 15136K
[    1.905880] This architecture does not have kernel memory protection.
[    1.912334] Run /init as init process
[    2.241387] init: Console is alive
[    2.253376] kmodloader: loading kernel modules from /etc/modules-boot.d/*
[    2.307904] SCSI subsystem initialized
[    2.314603] kmodloader: done loading kernel modules from /etc/modules-boot.d/*
[    2.328387] init: - preinit -
[    4.404826] random: crng init done
Press the [f] key and hit [enter] to enter failsafe mode
Press the [1], [2], [3] or [4] key and hit [enter] to select the debug level
[    8.521520] procd: - early -
[    9.045492] procd: - ubus -
[    9.103222] procd: - init -
Please press Enter to activate this console.
[    9.356145] kmodloader: loading kernel modules from /etc/modules.d/*
[    9.368462] tun: Universal TUN/TAP device driver, 1.6
[    9.414532] PPP generic driver version 2.4.2
[    9.420000] NET: Registered PF_PPPOX protocol family
[    9.428858] kmodloader: done loading kernel modules from /etc/modules.d/*
[    9.937247] urngd: v1.0.2 started.

BusyBox v1.37.0 (2026-01-02 11:16:09 UTC) built-in shell (ash)




|       |.-----.-----.-----.|  |  |  |.----.|  |_
|   -   ||  _  |  -|     ||  |  |  ||   ||   |
|_____||   |||||___|||  |____|
|| W I R E L E S S   F R E E D O M

OpenWrt SNAPSHOT, r32426-b817fb8e07

=== WARNING! =====================================
There is no root password defined on this device!
Use the "passwd" command to set up a new password
in order to prevent unauthorized SSH logins.

OpenWrt recently switched to the "apk" package manager!

OPKG Command           APK Equivalent      Description

opkg install      apk add        Install a package
opkg remove       apk del        Remove a package
opkg upgrade           apk upgrade         Upgrade all packages
opkg files        apk info -L    List package contents
opkg list-installed    apk info            List installed packages
opkg update            apk update          Update package lists
opkg search       apk search     Search for packages

For more information visit:





root@OpenWrt:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
root@OpenWrt:~# cat /proc.cpu/cpudininfo
system type: EcoNet-EN75xx
machine: Generic EN7528
processor: 0
cpu model: MIPS interAptiv (multi) V2.12
BogoMIPS: 864.25
wait instruction: yes
microsecond timers: yes
tlb_entries: 32
extra interrupt vector: yes
hardware watchpoint: yes, count: 4, address/irw mask: [0x0ffc, 0x0ffc, 0x0ffb, 0x0ffb]
isa: mips1 mips2 mips32r1 mips32r2
ASEs implemented: mips16 mips16e2 dsp dsp2 mt eva
Options implemented: tlb tlbinv segments rixiex 4kex 4k_cache 32fpr prefetch mcheck ejtag llsc rixi pindexed_dcache userlocal vint veic perf_cntr_intr_bit cdmm ebase_wg contextconfig perf
shadow register sets: 1
kscratch registers: 3
package: 0
core: 0
VPE: 0
VCED exceptions: not available
VCEI exceptions: not available

processor: 1
cpu model: MIPS interAptiv (multi) V2.12
BogoMIPS: 864.25
wait instruction: yes
microsecond timers: yes
tlb_entries: 32
extra interrupt vector: yes
hardware watchpoint: yes, count: 4, address/irw mask: [0x0ffc, 0x0ffc, 0x0ffb, 0x0ffb]
isa: mips1 mips2 mips32r1 mips32r2
ASEs implemented: mips16 mips16e2 dsp dsp2 mt eva
Options implemented: tlb tlbinv segments rixiex 4kex 4k_cache 32fpr prefetch mcheck ejtag llsc rixi pindexed_dcache userlocal vint veic perf_cntr_intr_bit cdmm ebase_wg contextconfig perf
shadow register sets: 1
kscratch registers: 3
package: 0
core: 0
VPE: 1
VCED exceptions: not available
VCEI exceptions: not available

processor: 2
cpu model: MIPS interAptiv (multi) V2.12
BogoMIPS: 864.25
wait instruction: yes
microsecond timers: yes
tlb_entries: 32
extra interrupt vector: yes
hardware watchpoint: yes, count: 4, address/irw mask: [0x0ffc, 0x0ffc, 0x0ffb, 0x0ffb]
isa: mips1 mips2 mips32r1 mips32r2
ASEs implemented: mips16 mips16e2 dsp dsp2 mt eva
Options implemented: tlb tlbinv segments rixiex 4kex 4k_cache 32fpr prefetch mcheck ejtag llsc rixi pindexed_dcache userlocal vint veic perf_cntr_intr_bit cdmm ebase_wg contextconfig perf
shadow register sets: 1
kscratch registers: 3
package: 0
core: 1
VPE: 0
VCED exceptions: not available
VCEI exceptions: not available

processor: 3
cpu model: MIPS interAptiv (multi) V2.12
BogoMIPS: 864.25
wait instruction: yes
microsecond timers: yes
tlb_entries: 32
extra interrupt vector: yes
hardware watchpoint: yes, count: 4, address/irw mask: [0x0ffc, 0x0ffc, 0x0ffb, 0x0ffb]
isa: mips1 mips2 mips32r1 mips32r2
ASEs implemented: mips16 mips16e2 dsp dsp2 mt eva
Options implemented: tlb tlbinv segments rixiex 4kex 4k_cache 32fpr prefetch mcheck ejtag llsc rixi pindexed_dcache userlocal vint veic perf_cntr_intr_bit cdmm ebase_wg contextconfig perf
shadow register sets: 1
kscratch registers: 3
package: 0
core: 1
VPE: 1
VCED exceptions: not available
VCEI exceptions: not available


1 Like

Please share the boot log of the stock firmware.

I used tio (https://github.com/tio/tio) for the terminal emulator (tio -b 115200 -l --log-strip --log-file c5500xk-session.log /dev/ttyUSB8) and to do the xmodem:

bldr> xmdm 80020000 5ED0DE
CCC
[02:13:44.902] Send file with XMODEM
[02:13:47.234] Sending file 'openwrt-econet-en7528-en7528_generic-initramfs-kernel.bin'
[02:13:47.234] Press any key to abort transfer
.......[SO MANY DOT!].......|
[02:23:56.528] Done

https://gist.github.com/RussellSenior/9c335e3da7cb536235e40a52862a1d26

1 Like

@russell Can you please share the output of cat /proc/interrupts . Also please check whether sleep 10 takes exactly 10 seconds

Those two was needed to get the DSA switch driver loaded. Some more glue code is needed to pass packets.

It should be possible to misuse the httpd server to upload images over ethernet. You can look here if you are up for the challenge:

1 Like

This matches the EN7580. So this chip will need a different dts and drivers compared to the EN7528.

root@OpenWrt:~# cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3
8: 3912212 0 0 0 MIPS GIC 37 timer
9: 0 3820730 0 0 MIPS GIC 36 timer
10: 0 0 3833313 0 MIPS GIC 44 timer
11: 0 0 0 3866420 MIPS GIC 43 timer
12: 64103 0 0 0 MIPS GIC 63 IPI call
13: 0 20599 0 0 MIPS GIC 64 IPI call
14: 0 0 12095 0 MIPS GIC 65 IPI call
15: 0 0 0 13083 MIPS GIC 66 IPI call
16: 522 0 0 0 MIPS GIC 67 IPI resched
17: 0 581 0 0 MIPS GIC 68 IPI resched
18: 0 0 459 0 MIPS GIC 69 IPI resched
19: 0 0 0 569 MIPS GIC 70 IPI resched
20: 28574 0 0 0 MIPS GIC 9 ttyS0
ERR: 0

sleep 10 takes 10 seconds (measured on a stop watch, within a few 10th of a second)

1 Like

The new econet_eth is now out: https://github.com/cjdelisle/econet_eth // https://github.com/openwrt/openwrt/pull/21557

This should be good enough quality that it has a chance of being merged into upstream. I’m going to look at the DSA support soon. PPE is not supported for now, I need time to get to that one…

4 Likes

Hello guys, small update. I got stalled out on DSA support because it turns out to be very complex, but I’ve just send upstream a patchset for supporting PCI, including some of the work from @naseef (Thanks!)

Here it is: https://lore.kernel.org/linux-mips/20260303190948.694783-1-cjd@cjdns.fr/T/#t

If someone wants to test it and reply to the relevant patches with a Tested-by, that’s always very welcome.

1 Like

Nice. I’ve been following this PR too (https://github.com/openwrt/openwrt/pull/22208). Think we will get full ethernet & wifi by April?

Well, full ethernet would imply the DSA switch, which implies about 1000 lines of additional PHY drivers, and it’s going to be fairly contentious because it is quite invasive to the MT7530 driver.

Current ethernet support puts the switch into dumb switch mode, which works nicely but only offers a single eth device, so it can be LAN or WAN but you can’t allocate one port to one and the other port to the other.

But with that limitation understood, ethernet and wifi is more or less done. It’s just a question of getting merged into OpenWrt. Upstreaming is a slow process so I wouldn’t put a date on that.

4 Likes

Could it be that there already is DSA driver? https://github.com/torvalds/linux/blob/master/drivers/net/dsa/mt7530.c

I’ve seen that ramips/mt7621 makes use of:
CONFIG_NET_DSA_MT7530=y
CONFIG_NET_DSA_MT7530_MDIO=y
# CONFIG_NET_DSA_MT7530_MMIO is not set