ZyXEL GS1900-24HP

The GS1900-24HP is a 24-port Gigabit L2 switch with 170W of PoE power budget.

Support forum: Zyxel GS1900-24HP v1 upgrade from old partition and pinout — no single dedicated “firmware” thread exists for this model; also see the original device-support thread on the lede-commits mailing list.

None at this time.

Install OpenWrt (generic explanation)

Users running OpenWrt 23.05 or earlier must perform a new factory install with the initramfs image when upgrading to 24.10 or later, due to a changed partition layout. As reported in the OpenWrt forum (not independently verified here), a direct sysupgrade from 23.05.x to 24.10.x/25.12.x is blocked with the error “The device is supported, but this image is incompatible for sysupgrade based on the image version (1.0→2.0)”, because the dual firmware partitions were merged to provide more usable space (13.9 MB instead of 2x 6.9 MB).

As reported in the OpenWrt forum, on OpenWrt 25.12.x the initramfs image uses a new rt-loader method to load the kernel which does not boot on the GS1900-24HP v1 (U-Boot 2.0.0.59413, RTL8382) — the device hangs with the SYS LED blinking continuously, both via TFTP and via LuCI flashing. The workaround is to use a 24.10.0 initramfs image to perform the initial factory install instead, then sysupgrade forward (see Upgrading OpenWrt below).

FIXME Find out flash layout, then add the flash layout table here.

Two step flashing process

Note: Reset router to factory defaults if it has been previously configured. * Log in to OEM management web interface. It should be at http://192.168.1.1 * Navigate to Maintenance > Firmware > Management * If “Active Image” has the first option selected, OpenWrt will need to be flashed to the “Active” partition. If the second option is selected, OpenWrt will need to be flashed to the “Backup” partition. * Navigate to Maintenance > Firmware > Upload * Upload the initramfs-kernel.bin file by your preferred method to the previously determined partition. When prompted, select to boot from the newly flashed image, and reboot the switch. * Once OpenWrt has booted, scp the sysupgrade.bin image to /tmp and flash it through SSH:

sysupgrade -n /tmp/<sysupgrade file name>

* OpenWrt does not include openssh-sftp-server by default. If your SCP client fails due to lacking an SFTP server on the device, install it first (opkg install openssh-sftp-server on 24.10.x, apk add openssh-sftp-server on 25.12.x), or use the legacy SCP protocol with the -O flag on the client side. * It may be necessary to restart the network (/etc/init.d/network restart) on the running initramfs image.

Specific values needed for tftp

Bootloader tftp server IPv4 address 192.168.1.1
Bootloader MAC address (special) N/A
Firmware tftp image Ramdisk image from latest OpenWrt release (NOTE: Name must contain “initramfs”)
TFTP client required IP address 192.168.1.111

* Configure your client with a static 192.168.1.x IP (e.g. 192.168.1.10). * Set up a TFTP server on your client and make it serve the initramfs image. * Connect serial, power up the switch, interrupt U-boot by hitting the space bar, and enable the network. * Since the GS1900-24HP is a dual-partition device, we want to make sure we are manipulating the first partition. Issue the following commands:

setsys bootpartition 0
savesys

* Download the image onto the device and boot from it:

tftpboot 0x81f00000 192.168.1.10:openwrt-realtek-rtl838x-zyxel_gs1900-24hp-v1-initramfs-kernel.bin
bootm

* Once OpenWrt has booted, scp the sysupgrade image to /tmp and flash it:

sysupgrade /tmp/openwrt-realtek-rtl838x-zyxel_gs1900-24hp-v1-squashfs-sysupgrade.bin

generic.sysupgrade

As reported in the OpenWrt forum (not independently verified here), a direct sysupgrade from 23.05.x to 25.12.x is not possible in a single step. The reported working upgrade path is: - Boot the 24.10.0 initramfs image via TFTP - sysupgrade to 24.10.0 full - sysupgrade to 24.10.6 (or later 24.10.x) - sysupgrade to 25.12.4

Jumping directly from a 24.10.6 initramfs to 25.12.x was reported to fail due to an out-of-memory condition during boot. If you have tested this path yourself on a GS1900-24HP v1, please update this section with your findings.

sysupgrade

* Login as root via SSH, then enter the following commands:

cd /tmp
wget http://downloads.openwrt.org/releases/25.12.4/targets/realtek/rtl838x/openwrt-25.12.4-realtek-rtl838x-zyxel_gs1900-24hp-v1-squashfs-sysupgrade.bin
sysupgrade /tmp/openwrt-25.12.4-realtek-rtl838x-zyxel_gs1900-24hp-v1-squashfs-sysupgrade.bin

Since the partition layout change in 24.10, the stock firmware's backup partition is not usable once OpenWRT has been installed. To revert to the factory image:

* Use the TFTP method to boot the OEM stock firmware image.

* Using the stock firmware's upgrade tools, flash the stock image to both partitions.

For OpenWRT versions < 24.10, you can revert to the backup partition if it is intact.

* To boot the Zyxel firmware from the secondary/backup ROM again, connect serial, power up the switch, interrupt U-boot, and issue:

setsys bootpartition 1
savesys

* Reboot the device. * To return to OpenWrt, repeat with bootpartition 0.

Basic configuration After flashing, proceed with this.

FIXME Please fill in real values for this device.

hardware.button on howto use and configure the hardware button(s).

BUTTON Event
CPU Reset reset
Soft Reset user

PoE+ is enabled on all ports when the device is powered on due to the bootloader initiating the PoE microcontroller unit (MCU). This also ensures that the PoE status LEDs on the front of the device work. The MCU's state is not preserved when the device is restarted. Thus, all connected PoE devices will briefly lose power when the switch reboots.

The realtek-poe package is included in OpenWrt images for this device. The included daemon (enabled by default) configures and monitors the MCU, allowing OpenWrt to manage PoE capabilities.

PoE port IDs are different to network interface numbers. The PoE port IDs for this device match. So interface lan1 has PoE port ID 1, lan2 has PoE port ID 2, etc.

The GS1900-24HP v1 uses a ST Micro ST32F100 microcontroller (firmware v17.1) communicating over UART at 9600 baud, and the Broadcom PoE dialect (6x BCM59111 PSE controllers), not the Realtek dialect used on some other models. Setting force_dialect 'realtek' on this device produces garbage values (firmware: v255.255, consumption: 6553.5) and must not be used.

Based on information from /etc/board.json, consider the following configuration in /etc/config/poe:

config global
option budget '170'
option force_baudrate '9600'

config port
option id '1'
option name 'lan1'
option enable '1'
option priority '2'
option power_limit '30000'

config port
option id '2'
option name 'lan2'
option enable '1'
option priority '2'
option power_limit '30000'
(...)

Repeat this configuration for the other ports (up to lan24) to let them be managed by the PoE daemon. Note that name is just a label for the PoE daemon to refer to a PoE-capable port. Making the name the same as the network interface of the relevant port makes management considerably easier.

Without force_baudrate '9600', the MCU replies with garbage data and the daemon log fills with request-bad-checksum errors:

daemon.notice realtek-poe: MCU rejected command: request-bad-checksum
daemon.notice realtek-poe:     CMD:    1c 08 00 00 01 00 02 00 03 00 ff 29
daemon.notice realtek-poe:     reply:  fe ff ff ff ff ff ff ff ff ff ff f4

Make sure to reload the PoE daemon's configuration after making changes to the configuration. Applying changes to the total available power budget requires a restart of the daemon.

PoE command cheat sheet:

Action Command
Restart PoE daemon
/etc/init.d/poe restart
Get all PoE daemon
capabilities
ubus -v list poe
Reload configuration
from /etc/config/poe
ubus call poe reload
Current PoE status
ubus call poe info
Disable PoE on a
configured PoE port
ubus call poe manage '{ "port" : "lan1", "enable" : false }'
Enable PoE on a
configured PoE port
ubus call poe manage '{ "port" : "lan1", "enable" : true }'

Known issue 1: ubus call poe manage returns Parsing message data failed on OpenWrt 24.10.0 through at least 25.12.4 (realtek-poe 1.3 / 1.3-r1 / 1.3.1-r1). According to PR #69 (pending merge as of July 2026), the command does actually work — the port is correctly enabled or disabled on the MCU — but ubus incorrectly reports it as an error because ustream_write() returns 12 (the number of bytes written) which is misinterpreted as UBUS_STATUS_PARSE_ERROR. The fix is pending in the upstream realtek-poe repository.

Known issue 2: PoE not working correctly on 25.12.x — ports may be stuck at Requesting power or power budget may not be applied correctly across all ports. According to PR #70 (pending merge as of July 2026), this is caused by OpenWrt renaming the board identifier from zyxel,gs1900-24hp-v1 to zyxel,gs1900-24hp-a1 while config_apply_quirks() in realtek-poe still matched only the old name, causing the power budget to never be sent to all 8 PSE IDs. The fix is pending in the upstream realtek-poe repository.

Known issue 3: force_baudrate disappearing from config — if uci commit poe is called when force_baudrate is not in the current UCI in-memory tree (e.g. after repeated uci set operations), the option may silently disappear from /etc/config/poe. This causes the daemon to revert to 115200 baud, producing continuous request-bad-checksum errors and status: unknown for all ports. Workaround: always explicitly re-set force_baudrate before each commit:

uci set poe.@global[0].force_baudrate='9600'
uci set poe.@port[5].enable='0'
uci commit poe
/etc/init.d/poe restart

Or use the wrapper script below which does this automatically.

To avoid the force_baudrate disappearing issue, use this wrapper script instead of calling UCI directly. Copy it to the switch once and call it from automation tools (e.g. Home Assistant SSH integration):

#!/bin/sh
# /usr/bin/poe_toggle.sh
# Usage: sh /usr/bin/poe_toggle.sh <port_index 0-23> <0|1>
# Example: sh /usr/bin/poe_toggle.sh 13 0   (disable lan14)
#          sh /usr/bin/poe_toggle.sh 13 1   (enable lan14)

PORT_INDEX="$1"
ENABLE="$2"

if [ -z "$PORT_INDEX" ] || [ -z "$ENABLE" ]; then
    echo "Usage: $0 <port_index 0-23> <0|1>"
    exit 1
fi

uci set poe.@global[0].force_baudrate='9600'
uci set poe.@port[$PORT_INDEX].enable="$ENABLE"
uci commit poe
/etc/init.d/poe restart

Port index is port number minus one (lan14 = index 13, lan6 = index 5, etc.).

PoE may appear completely broken after a clean install/upgrade to 25.12.x, with all ports stuck at Requesting power and never reaching Delivering power. Two possible causes:

  1. Stale configuration carried over from an earlier install. Reflashing with sysupgrade -n (no config retention) and recreating /etc/config/poe from scratch resolves this.
  2. Board name mismatch in realtek-poe (see Known issue 2 above, PR #70). Until this PR is merged and released, reinstalling realtek-poe will not help as the bug is in the current released version.

If the realtek-poe package needs to be reinstalled (25.12.x uses apk):

apk update
apk add --allow-untrusted realtek-poe
/etc/init.d/poe restart

Front:
Insert photo of front of the casing

Back:
Insert photo of back of the casing

Warranty

port.serial general information about the serial port, serial port cable, etc.

Pin Function
2 TX → RX of your RS232 adapter
3 RX ← TX of your RS232 adapter
5 GND

Serial connection parameters
for ZyXEL GS1900-24HP v1
115200, 8N1

None so far.

FIXME add OEM bootlog here

OpenWrt 25.12.4 (r33051-f5dae5ece4), Kernel 6.12.94, realtek/rtl838x [ 0.000000] Linux version 6.12.94 (builder@buildhost) (mips-openwrt-linux-musl-gcc (OpenWrt GCC 14.3.0 r33051-f5dae5ece4) 14.3.0, GNU ld (GNU Binutils) 2.44) #0 Mon Jun 29 12:59:20 2026 [ 0.000000] SoC Type: Realtek RTL8382M rev C (6275) [ 0.000000] printk: legacy bootconsole [early0] enabled [ 0.000000] CPU0 revision is: 00019070 (MIPS 4KEc) [ 0.000000] MIPS: machine is Zyxel GS1900-24HP A1 [ 0.000000] earlycon: ns16550a0 at MMIO 0x18002000 (options '115200n8') [ 0.000000] printk: legacy bootconsole [ns16550a0] enabled [ 0.000000] Initrd not found or empty - disabling initrd [ 0.000000] Using appended Device Tree. [ 0.000000] Primary instruction cache 16kB, VIPT, 4-way, linesize 16 bytes. [ 0.000000] Primary data cache 16kB, 2-way, VIPT, cache aliases, linesize 16 bytes [ 0.000000] Zone ranges: [ 0.000000] Normal [mem 0x0000000000000000-0x0000000003ffffff] [ 0.000000] Memory: 53804K/65536K available (7409K kernel code, 622K rwdata, 964K rodata, 1236K init, 242K bss, 11220K reserved, 0K cma-reserved) [ 0.000000] rtl83xx-clk: initialized, CPU 500 MHz, MEM 300 MHz (8 Bit DDR2), LXB 200 MHz [ 0.009432] Calibrating delay loop... 498.89 BogoMIPS (lpj=2494464) [ 0.503285] Serial: 8250/16550 driver, 16 ports, IRQ sharing enabled [ 0.535204] 18002000.uart: ttyS0 at MMIO 0x18002000 (irq = 31, base_baud = 12500000) is a 16550A [ 0.662753] 18002100.uart: ttyS1 at MMIO 0x18002100 (irq = 30, base_baud = 12500000) is a 16550A [ 0.786064] 6 fixed-partitions partitions found on MTD device spi0.0 [ 0.799308] 0x000000000000-0x000000040000 : “u-boot” [ 0.811340] 0x000000040000-0x000000050000 : “u-boot-env” [ 0.821894] 0x000000050000-0x000000060000 : “u-boot-env2” [ 0.832741] 0x000000060000-0x000000160000 : “jffs” [ 0.842862] 0x000000160000-0x000000260000 : “jffs2” [ 0.853050] 0x000000260000-0x000001000000 : “firmware” [ 0.876599] 0x000000000000-0x0000003b0000 : “kernel” [ 0.886860] 0x0000003b0000-0x000000da0000 : “rootfs” [ 0.909685] 0x000000640000-0x000000da0000 : “rootfs_data” [ 1.062521] Firmware loaded. Size 1184, magic: 83808380 [ 1.068619] Realtek RTL8218B (internal) 1b000000.switchcore:mdio-controller-mii:08: patch [ 1.264095] Firmware loaded. Size 1168, magic: 83808380 [ 1.374825] Realtek RTL8218B (external) 1b000000.switchcore:mdio-controller-mii:00: patch chip revision 2 [ 1.556908] Firmware loaded. Size 1168, magic: 83808380 [ 1.664827] Realtek RTL8218B (external) 1b000000.switchcore:mdio-controller-mii:10: patch chip revision 2 [ 1.906722] Using MAC 0000b8eca3ab2978 [ 2.133829] sfp sfp-p25: Host maximum power 1.0W [ 2.140764] sfp sfp-p26: Host maximum power 1.0W [ 4.274297] rtl83xx-switch switch@1b000000: Link is Up - 1Gbps/Full - flow control off [ 4.299265] rtl83xx-switch switch@1b000000 lan1 (uninitialized): PHY [1b000000.switchcore:mdio-controller-mii:00] driver [Realtek RTL8218B (external)] (irq=POLL) [ 4.877162] rtl838x-eth 1b00a300.ethernet eth0: entered promiscuous mode [ 4.885204] DSA: tree 0 setup [ 4.963160] VFS: Mounted root (squashfs filesystem) readonly on device 31:7. [ 5.003693] Run /sbin/init as init process [ 6.065520] init: Console is alive [ 6.609564] kmodloader: loading kernel modules from /etc/modules-boot.d/* [ 6.712464] init: - preinit - [ 10.454649] random: crng init done [ 15.408240] RESETTING 8380, CPU_PORT 28 [ 15.838578] rtl838x-eth 1b00a300.ethernet eth0: Link is Up - 1Gbps/Full - flow control off [ 53.639189] jffs2: notice: (843) jffs2_build_xattr_subsystem: complete building xattr subsystem, 0 of xdatum (0 unchecked, 0 orphan) and 0 of xref (0 dead, 0 orphan) found. [ 53.674071] mount_root: switching to jffs2 overlay [ 55.346726] procd: - early - [ 56.344718] procd: - ubus - [ 56.512990] procd: - init - [ 59.456173] kmodloader: done loading kernel modules from /etc/modules.d/* [ 62.265569] urngd: v1.0.2 started. [ 90.914871] rtl83xx-switch switch@1b000000 lan26: Link is Up - 1Gbps/Full - flow control rx/tx

This page reflects field experience running both OpenWrt 24.10.7 and 25.12.4 on the GS1900-24HP v1, including a confirmed PoE regression and working configuration. See also the related upstream bug reports: issue #18528 (PoE manage command not working on GS1900-24HP v1 with 24.10.x — resolved by reflashing without config retention) and issue #23557 (the 25.12.x PoE regression described above).

luci-port-labels — adds clickable per-port labels to the LuCI Status → Overview page. Developed and tested on the GS1900-24HP (v1/A1 and B1) and GS1900-10HP, running OpenWrt 24.10.x and 25.12.x. Note that 29_ports.js must be patched in place on the target switch — do not copy a patched file from another device as the file differs between LuCI versions.

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
  • Last modified: 2026/07/21 05:39
  • by bdm310