realtek: add support for D-Link DGS-1250-28X

Hardware specification
----------------------

* RTL9301 SoC, 1 MIPS 34KEc core @ 800MHz
* 512MB DRAM
* 64MB NAND Flash
* 24 x 10/100/1000BASE-T ports
* 4 x 10G SFP+ ports
* Power LED, Console LED, Fan Fault LED
* Reset button on front panel
* LM75 temperature sensor
* Atmel AT24C02 2kb eeprom
* fan (controllable via gpio for on/off and LM75 for low/high speed)
* UART (115200 8N1) via RJ45

Installation using serial interface
-----------------------------------

 1. Prepare TFTP server & connect to serial port.
 2. Connect DGS-1250 to your computer or network with one of the
    1G ports. All of them will be fine.
 3. Power on DGS-1250 and interrupt autoboot with "&".
 4. Change U-Boot startup sequence
	> setenv silent
	> setenv bootcmd 'cp.l 0xb4200000 0x84000000 0x300000; bootm 0x84000000'
	> saveenv
 5. Enable networking within U-Boot.
	> rtk network on
 6. Set switch IP and TFTP server IP (optional, adjust to your setup).
	> setenv ipaddr <ip>
	> setenv serverip <ip>
 7. Download initramfs image from TFTP server.
	> tftpboot 0x84000000 <image name>
 8. Boot with the downloaded image.
	> bootm 0x84000000
 9. With rambooted OpenWrt, backup the stock firmware.
    THIS IS CRITICAL! /dev/mtd3 contains data that is not provided
    in the downloadable vendor firmware images.
10. Copy sysupgrade image to the device.
11. Perform sysupgrade with the sysupgrade image.
12. After reboot, you should have functional OpenWrt.

Installation using OEM webinterface
-----------------------------------

This is not possible because the vendor image uses a ubifs based
loading technique with encrypted images. To be precise the boot
sequence basically runs as follows.

 1. U-Boot starts
 2. U-Boot mounts 62MB ubifs from mtd3
 3. U-Boot reads Linux kernel from file uImage inside ubifs
 4. Linux starts (this is a initramfs image)
 5. Linux mounts ubifs
 6. Linux calls a loader binary
 7. Depending on current configuration first (file Image1) or
    second firmware image (file Image2) is loaded and decrypted
 8. Inside the decrpyted firmware image there is a executable
    named “switch”
 9. "switch" executable is run and the switch comes alive

Reverting to stock firmware
---------------------------

 1. Boot OpenWrt from initramfs (like in installation section above)
 2. Restore partition /dev/mtd3 from backup
 3. Erase Openwrt special U-Boot env
	# mtd erase mtd1
 4. reboot

Further information
-------------------

Wiki: https://openwrt.org/toh/d-link/dgs-1250
Forum: https://forum.openwrt.org/t/support-for-d-link-dgs-1250-switches
Partition dumps: https://github.com/plappermaul/realtek-doc/tree/main/DGS-1250

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/22530
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
This commit is contained in:
Markus Stockhausen 2026-03-20 20:40:16 +01:00 committed by Hauke Mehrtens
parent 5017117fa6
commit 4439b2ddc2
4 changed files with 440 additions and 0 deletions

View File

@ -74,6 +74,7 @@ realtek_setup_macs()
lan_mac=$(get_mac_label)
lan_mac_start=$lan_mac
;;
d-link,dgs-1250-28x|\
hasivo,s1100wp-8gt-se|\
hpe,1920-8g|\
hpe,1920-8g-poe-65w|\

View File

@ -35,11 +35,25 @@ plasmacloud_common() {
echo 2 > "$path_to_hwmon/pwm2_enable"
}
dlink_dgs_1250() {
local path_temp_hwmon="$(find /sys/devices/platform/i2c-gpio-4/i2c-4/4-0048/hwmon/ -type d -maxdepth 1 -mindepth 1 -name 'hwmon*')"
local path_fan_hwmon="$(find /sys/devices/platform/gpio-fan/hwmon/ -type d -maxdepth 1 -mindepth 1 -name 'hwmon*')"
# Activate fan and let LM75 steer high/low speed via alert pin
# vendor defaults for DGS-1250-28X are 69C low->high and 57C high->low
echo 1 > "$path_fan_hwmon/fan1_target"
echo 69000 > "$path_temp_hwmon/temp1_max"
echo 57000 > "$path_temp_hwmon/temp1_max_hyst"
}
boot() {
case $(board_name) in
plasmacloud,esx28|\
plasmacloud,psx28)
plasmacloud_common
;;
d-link,dgs-1250-28x)
dlink_dgs_1250
;;
esac
}

View File

@ -0,0 +1,415 @@
// SPDX-License-Identifier: (GPL-2.0-or-later or MIT)
/dts-v1/;
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
#include <dt-bindings/leds/common.h>
#include "rtl930x.dtsi"
/ {
compatible = "d-link,dgs-1250-28x", "realtek,rtl9301-soc";
model = "D-Link DGS-1250-28X";
aliases {
label-mac-device = &ethernet0;
led-boot = &led_power;
led-failsafe = &led_console;
led-running = &led_power;
led-upgrade = &led_console;
};
memory@0 {
device_type = "memory";
reg = <0x00000000 0x10000000>;
};
fan: gpio-fan {
compatible = "gpio-fan";
gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>;
alarm-gpios = <&gpio0 8 GPIO_ACTIVE_HIGH>;
/* simple on/off values as LM75 alert pin steers fan high/low speed */
gpio-fan,speed-map = <0 0>, <1 1>;
#cooling-cells = <2>;
};
i2c-gpio-shared {
compatible = "i2c-gpio-shared";
scl-gpios = <&gpio0 14 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
#address-cells = <1>;
#size-cells = <0>;
i2c0: i2c@0 {
sda-gpios = <&gpio0 17 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
i2c-gpio,delay-us = <5>;
};
i2c1: i2c@1 {
sda-gpios = <&gpio0 18 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
i2c-gpio,delay-us = <5>;
};
i2c2: i2c@2 {
sda-gpios = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
i2c-gpio,delay-us = <5>;
};
i2c3: i2c@3 {
sda-gpios = <&gpio0 20 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
i2c-gpio,delay-us = <5>;
};
};
i2c4: i2c-gpio-4 {
compatible = "i2c-gpio";
sda-gpios = <&gpio0 15 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
scl-gpios = <&gpio0 13 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
i2c-gpio,delay-us = <5>;
#address-cells = <1>;
#size-cells = <0>;
gpio1: gpio-expander@20 {
compatible = "nxp,pca9555";
reg = <0x20>;
gpio-controller;
#gpio-cells = <2>;
};
temperature_sensor: temperature-sensor@48 {
compatible = "microchip,tcn75";
reg = <0x48>;
#thermal-sensor-cells = <0>;
alert-polarity-active-high;
};
eeprom@50 {
compatible = "atmel,24c02";
reg = <0x50>;
read-only;
nvmem-layout {
compatible = "fixed-layout";
#address-cells = <1>;
#size-cells = <1>;
mac_address: mac-address@10 {
reg = <0x10 0x6>;
};
};
};
};
keys {
compatible = "gpio-keys";
reset {
label = "reset";
gpios = <&gpio0 16 GPIO_ACTIVE_LOW>;
linux,code = <KEY_RESTART>;
};
};
led_set {
compatible = "realtek,rtl9300-leds";
active-low;
/*
* 1G Ports LED0 (green): 1G/LINK/ACT
* 1G Ports LED1 (orange): 10M/100M/LINK/ACT
*/
led_set0 = <(RTL93XX_LED_SET_1G | RTL93XX_LED_SET_LINK | RTL93XX_LED_SET_ACT)
(RTL93XX_LED_SET_10M | RTL93XX_LED_SET_100M |
RTL93XX_LED_SET_LINK | RTL93XX_LED_SET_ACT)>;
/*
* 10G Ports LED0 (green): 10G/LINK/ACT
* 10G Ports LED1 (orange): 10M/100M/1G/2.5G/5G/LINK/ACT
*/
led_set1 = <(RTL93XX_LED_SET_10G | RTL93XX_LED_SET_LINK | RTL93XX_LED_SET_ACT)
(RTL93XX_LED_SET_10M | RTL93XX_LED_SET_100M | RTL93XX_LED_SET_1G |
RTL93XX_LED_SET_2P5G | RTL93XX_LED_SET_5G |
RTL93XX_LED_SET_LINK | RTL93XX_LED_SET_ACT)>;
};
leds: leds {
pinctrl-names = "default";
pinctrl-0 = <&pinmux_disable_sys_led>;
compatible = "gpio-leds";
led_power: led-0 {
function = LED_FUNCTION_POWER;
color = <LED_COLOR_ID_GREEN>;
gpios = <&gpio0 0 GPIO_ACTIVE_LOW>;
};
led_console: led-1 {
function = LED_FUNCTION_STATUS;
color = <LED_COLOR_ID_GREEN>;
gpios = <&gpio0 1 GPIO_ACTIVE_LOW>;
};
led_fault: led-2 {
function = LED_FUNCTION_FAULT;
color = <LED_COLOR_ID_RED>;
gpios = <&gpio0 2 GPIO_ACTIVE_LOW>;
};
};
sfp0: sfp-p24 {
compatible = "sff,sfp";
i2c-bus = <&i2c0>;
mod-def0-gpio = <&gpio1 0 GPIO_ACTIVE_LOW>;
tx-disable-gpio = <&gpio1 1 GPIO_ACTIVE_HIGH>;
tx-fault-gpio = <&gpio1 2 GPIO_ACTIVE_HIGH>;
los-gpio = <&gpio1 3 GPIO_ACTIVE_HIGH>;
};
sfp1: sfp-p25 {
compatible = "sff,sfp";
i2c-bus = <&i2c1>;
mod-def0-gpio = <&gpio1 4 GPIO_ACTIVE_LOW>;
tx-disable-gpio = <&gpio1 5 GPIO_ACTIVE_HIGH>;
tx-fault-gpio = <&gpio1 6 GPIO_ACTIVE_HIGH>;
los-gpio = <&gpio1 7 GPIO_ACTIVE_HIGH>;
};
sfp2: sfp-p26 {
compatible = "sff,sfp";
i2c-bus = <&i2c2>;
mod-def0-gpio = <&gpio1 8 GPIO_ACTIVE_LOW>;
tx-disable-gpio = <&gpio1 9 GPIO_ACTIVE_HIGH>;
tx-fault-gpio = <&gpio1 10 GPIO_ACTIVE_HIGH>;
los-gpio = <&gpio1 11 GPIO_ACTIVE_HIGH>;
};
sfp3: sfp-p27 {
compatible = "sff,sfp";
i2c-bus = <&i2c3>;
mod-def0-gpio = <&gpio1 12 GPIO_ACTIVE_LOW>;
tx-disable-gpio = <&gpio1 13 GPIO_ACTIVE_HIGH>;
tx-fault-gpio = <&gpio1 14 GPIO_ACTIVE_HIGH>;
los-gpio = <&gpio1 15 GPIO_ACTIVE_HIGH>;
};
};
&spi0 {
status = "okay";
flash@0 {
compatible = "jedec,spi-nor";
reg = <0>;
spi-max-frequency = <10000000>;
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
partition@0 {
label = "u-boot";
reg = <0x0 0x100000>;
read-only;
};
partition@100000 {
label = "u-boot-env";
reg = <0x100000 0x80000>;
};
partition@180000 {
label = "u-boot-env2";
reg = <0x180000 0x80000>;
};
partition@200000 {
label = "firmware";
compatible = "openwrt,uimage";
reg = <0x200000 0x3e00000>;
};
};
};
};
&mdio_bus0 {
phy0: ethernet-phy@0 {
reg = <0>;
compatible = "ethernet-phy-ieee802.3-c22";
};
phy1: ethernet-phy@1 {
reg = <1>;
compatible = "ethernet-phy-ieee802.3-c22";
};
phy2: ethernet-phy@2 {
reg = <2>;
compatible = "ethernet-phy-ieee802.3-c22";
};
phy3: ethernet-phy@3 {
reg = <3>;
compatible = "ethernet-phy-ieee802.3-c22";
};
phy4: ethernet-phy@4 {
reg = <4>;
compatible = "ethernet-phy-ieee802.3-c22";
};
phy5: ethernet-phy@5 {
reg = <5>;
compatible = "ethernet-phy-ieee802.3-c22";
};
phy6: ethernet-phy@6 {
reg = <6>;
compatible = "ethernet-phy-ieee802.3-c22";
};
phy7: ethernet-phy@7 {
reg = <7>;
compatible = "ethernet-phy-ieee802.3-c22";
};
};
&mdio_bus1 {
phy8: ethernet-phy@8 {
reg = <8>;
compatible = "ethernet-phy-ieee802.3-c22";
};
phy9: ethernet-phy@9 {
reg = <9>;
compatible = "ethernet-phy-ieee802.3-c22";
};
phy10: ethernet-phy@10 {
reg = <10>;
compatible = "ethernet-phy-ieee802.3-c22";
};
phy11: ethernet-phy@11 {
reg = <11>;
compatible = "ethernet-phy-ieee802.3-c22";
};
phy12: ethernet-phy@12 {
reg = <12>;
compatible = "ethernet-phy-ieee802.3-c22";
};
phy13: ethernet-phy@13 {
reg = <13>;
compatible = "ethernet-phy-ieee802.3-c22";
};
phy14: ethernet-phy@14 {
reg = <14>;
compatible = "ethernet-phy-ieee802.3-c22";
};
phy15: ethernet-phy@15 {
reg = <15>;
compatible = "ethernet-phy-ieee802.3-c22";
};
};
&mdio_bus2 {
phy16: ethernet-phy@16 {
reg = <16>;
compatible = "ethernet-phy-ieee802.3-c22";
};
phy17: ethernet-phy@17 {
reg = <17>;
compatible = "ethernet-phy-ieee802.3-c22";
};
phy18: ethernet-phy@18 {
reg = <18>;
compatible = "ethernet-phy-ieee802.3-c22";
};
phy19: ethernet-phy@19 {
reg = <19>;
compatible = "ethernet-phy-ieee802.3-c22";
};
phy20: ethernet-phy@20 {
reg = <20>;
compatible = "ethernet-phy-ieee802.3-c22";
};
phy21: ethernet-phy@21 {
reg = <21>;
compatible = "ethernet-phy-ieee802.3-c22";
};
phy22: ethernet-phy@22 {
reg = <22>;
compatible = "ethernet-phy-ieee802.3-c22";
};
phy23: ethernet-phy@23 {
reg = <23>;
compatible = "ethernet-phy-ieee802.3-c22";
};
};
&switch0 {
ethernet-ports {
#address-cells = <1>;
#size-cells = <0>;
SWITCH_PORT_LED(0, 1, 0, 0, qsgmii)
SWITCH_PORT_LED(1, 2, 0, 0, qsgmii)
SWITCH_PORT_LED(2, 3, 0, 0, qsgmii)
SWITCH_PORT_LED(3, 4, 0, 0, qsgmii)
SWITCH_PORT_LED(4, 5, 1, 0, qsgmii)
SWITCH_PORT_LED(5, 6, 1, 0, qsgmii)
SWITCH_PORT_LED(6, 7, 1, 0, qsgmii)
SWITCH_PORT_LED(7, 8, 1, 0, qsgmii)
SWITCH_PORT_LED(8, 9, 2, 0, usxgmii)
SWITCH_PORT_LED(9, 10, 2, 0, usxgmii)
SWITCH_PORT_LED(10, 11, 2, 0, usxgmii)
SWITCH_PORT_LED(11, 12, 2, 0, usxgmii)
SWITCH_PORT_LED(12, 13, 2, 0, usxgmii)
SWITCH_PORT_LED(13, 14, 2, 0, usxgmii)
SWITCH_PORT_LED(14, 15, 2, 0, usxgmii)
SWITCH_PORT_LED(15, 16, 2, 0, usxgmii)
SWITCH_PORT_LED(16, 17, 3, 0, usxgmii)
SWITCH_PORT_LED(17, 18, 3, 0, usxgmii)
SWITCH_PORT_LED(18, 19, 3, 0, usxgmii)
SWITCH_PORT_LED(19, 20, 3, 0, usxgmii)
SWITCH_PORT_LED(20, 21, 3, 0, usxgmii)
SWITCH_PORT_LED(21, 22, 3, 0, usxgmii)
SWITCH_PORT_LED(22, 23, 3, 0, usxgmii)
SWITCH_PORT_LED(23, 24, 3, 0, usxgmii)
port@24 {
reg = <24>;
label = "lan25";
led-set = <1>;
pcs-handle = <&serdes4>;
phy-mode = "1000base-x";
managed = "in-band-status";
sfp = <&sfp0>;
};
port@25 {
reg = <25>;
label = "lan26";
led-set = <1>;
pcs-handle = <&serdes6>;
phy-mode = "1000base-x";
managed = "in-band-status";
sfp = <&sfp1>;
};
port@26 {
reg = <26>;
label = "lan27";
led-set = <1>;
pcs-handle = <&serdes8>;
phy-mode = "1000base-x";
managed = "in-band-status";
sfp = <&sfp2>;
};
port@27 {
reg = <27>;
label = "lan28";
led-set = <1>;
pcs-handle = <&serdes9>;
phy-mode = "1000base-x";
managed = "in-band-status";
sfp = <&sfp3>;
};
port@28 {
reg = <28>;
ethernet = <&ethernet0>;
phy-mode = "internal";
fixed-link {
speed = <1000>;
full-duplex;
};
};
};
};
&ethernet0 {
nvmem-cells = <&mac_address>;
nvmem-cell-names = "mac-address";
};

View File

@ -2,6 +2,16 @@
include ./common.mk
define Device/d-link_dgs-1250-28x
SOC := rtl9301
DEVICE_VENDOR := D-Link
DEVICE_MODEL := DGS-1250-28X
DEVICE_PACKAGES += kmod-hwmon-lm75
IMAGE_SIZE := 24576k
$(Device/kernel-lzma)
endef
TARGET_DEVICES += d-link_dgs-1250-28x
define Device/hasivo_s1100w-8xgt-se
SOC := rtl9303
DEVICE_VENDOR := Hasivo