diff mbox

[LEDE-DEV] ramips: add support for Ubiquiti EdgeRouter X-SFP

Message ID 1495916770-14584-1-git-send-email-devel-sven@geroedel.de
State Changes Requested
Headers show

Commit Message

Sven Roederer May 27, 2017, 8:26 p.m. UTC
This patch adds support for the Ubiquiti EdgeRouter X-SFP and
improves support for the EdgeRouter X.

Specification:
- SoC: MediaTek MT7621AT
- Flash: 256 MiB
- RAM: 265 MiB
- Ethernet: 5 x LAN (1000 Mbps)
- UART: 1 x UART on PCB (3.3V, RX, TX, GND) - 57600 8N1
- EdgeRouter X:
  - 1 x PoE-Passtrough (Eth4)
  - powered by Wallwart or passive PoE
- EdgeRouter X-SFP:
  - 5 x PoE-Out (24V, passive)
  - 1 x SFP (unknown status)
  - powered by Wallwart (24V)

Doesn't work:
* SoC has crypto engine but no open driver.
* SoC has nat acceleration, but no open driver.
* This router has 2MB spi flash soldered in but MT
  nand/spi drivers do not support pin sharing,
  so it is not accessable and disabled. Stock
  firmware could read it and it was empty.

Installation

via vendor firmware:
- build an Initrd-image (> 3MiB) and upload the factory-image
- initrd can have luci-mod-failsafe
- flash final firmware via LuCI / sysupgrade on rebooted system

via TFTP:
- stop uboot into tftp-load into option "1"
- upload factory.bin image

Signed-off-by: Sven Roederer <devel-sven@geroedel.de>
---
 .../linux/ramips/base-files/etc/board.d/02_network |   1 +
 .../ramips/base-files/etc/board.d/03_gpio_switches |  25 +++++
 target/linux/ramips/base-files/lib/ramips.sh       |   3 +
 .../ramips/base-files/lib/upgrade/platform.sh      |   9 +-
 target/linux/ramips/dts/UBNT-ERX-SFP.dts           |  24 +++++
 target/linux/ramips/dts/UBNT-ERX.dts               | 102 +-------------------
 target/linux/ramips/dts/UBNT-ERX.dtsi              | 106 +++++++++++++++++++++
 target/linux/ramips/image/mt7621.mk                |  13 +++
 8 files changed, 179 insertions(+), 104 deletions(-)
 create mode 100755 target/linux/ramips/base-files/etc/board.d/03_gpio_switches
 create mode 100644 target/linux/ramips/dts/UBNT-ERX-SFP.dts
 create mode 100644 target/linux/ramips/dts/UBNT-ERX.dtsi

Comments

Julian Labus May 28, 2017, 10:49 a.m. UTC | #1
Hi Sven,

the patch doesn't apply on the current master branch.
Commit 4c3953b it the problem because UBNT-ERX.dts was altered.
Applying it on the previous commit 64f2efc works fine.

PS: What about renaming UBNT-ERX.dtsi to ER-e50.dtsi which is
the name of the series ERX and ERX-SFTP are based on because
we have also the EP-R6 which is mostly a ERX-SFP in an outdoor
case.

Regards,
Julian

On 05/27/2017 10:26 PM, Sven Roederer wrote:
> This patch adds support for the Ubiquiti EdgeRouter X-SFP and
> improves support for the EdgeRouter X.
> 
> Specification:
> - SoC: MediaTek MT7621AT
> - Flash: 256 MiB
> - RAM: 265 MiB
> - Ethernet: 5 x LAN (1000 Mbps)
> - UART: 1 x UART on PCB (3.3V, RX, TX, GND) - 57600 8N1
> - EdgeRouter X:
>   - 1 x PoE-Passtrough (Eth4)
>   - powered by Wallwart or passive PoE
> - EdgeRouter X-SFP:
>   - 5 x PoE-Out (24V, passive)
>   - 1 x SFP (unknown status)
>   - powered by Wallwart (24V)
> 
> Doesn't work:
> * SoC has crypto engine but no open driver.
> * SoC has nat acceleration, but no open driver.
> * This router has 2MB spi flash soldered in but MT
>   nand/spi drivers do not support pin sharing,
>   so it is not accessable and disabled. Stock
>   firmware could read it and it was empty.
> 
> Installation
> 
> via vendor firmware:
> - build an Initrd-image (> 3MiB) and upload the factory-image
> - initrd can have luci-mod-failsafe
> - flash final firmware via LuCI / sysupgrade on rebooted system
> 
> via TFTP:
> - stop uboot into tftp-load into option "1"
> - upload factory.bin image
> 
> Signed-off-by: Sven Roederer <devel-sven@geroedel.de>
> ---
>  .../linux/ramips/base-files/etc/board.d/02_network |   1 +
>  .../ramips/base-files/etc/board.d/03_gpio_switches |  25 +++++
>  target/linux/ramips/base-files/lib/ramips.sh       |   3 +
>  .../ramips/base-files/lib/upgrade/platform.sh      |   9 +-
>  target/linux/ramips/dts/UBNT-ERX-SFP.dts           |  24 +++++
>  target/linux/ramips/dts/UBNT-ERX.dts               | 102 +-------------------
>  target/linux/ramips/dts/UBNT-ERX.dtsi              | 106 +++++++++++++++++++++
>  target/linux/ramips/image/mt7621.mk                |  13 +++
>  8 files changed, 179 insertions(+), 104 deletions(-)
>  create mode 100755 target/linux/ramips/base-files/etc/board.d/03_gpio_switches
>  create mode 100644 target/linux/ramips/dts/UBNT-ERX-SFP.dts
>  create mode 100644 target/linux/ramips/dts/UBNT-ERX.dtsi
> 
> diff --git a/target/linux/ramips/base-files/etc/board.d/02_network b/target/linux/ramips/base-files/etc/board.d/02_network
> index 80a3bc2..490a41e 100755
> --- a/target/linux/ramips/base-files/etc/board.d/02_network
> +++ b/target/linux/ramips/base-files/etc/board.d/02_network
> @@ -165,6 +165,7 @@ ramips_setup_interfaces()
>  	rb750gr3|\
>  	rt-n14u|\
>  	ubnt-erx|\
> +	ubnt-erx-sfp|\
>  	ur-326n4g|\
>  	wrtnode|\
>  	wrtnode2p | \
> diff --git a/target/linux/ramips/base-files/etc/board.d/03_gpio_switches b/target/linux/ramips/base-files/etc/board.d/03_gpio_switches
> new file mode 100755
> index 0000000..859dfb3
> --- /dev/null
> +++ b/target/linux/ramips/base-files/etc/board.d/03_gpio_switches
> @@ -0,0 +1,25 @@
> +#!/bin/sh
> +
> +. /lib/functions/uci-defaults.sh
> +. /lib/ramips.sh
> +
> +board_config_update
> +
> +board=$(ramips_board_name)
> +
> +case "$board" in
> +ubnt-erx)
> +	ucidef_add_gpio_switch "poe_passthrough" "PoE Passthrough" "0"
> +	;;
> +ubnt-erx-sfp)
> +	ucidef_add_gpio_switch "poe_power_port0" "PoE Power Port0" "496"
> +	ucidef_add_gpio_switch "poe_power_port1" "PoE Power Port1" "497"
> +	ucidef_add_gpio_switch "poe_power_port2" "PoE Power Port2" "498"
> +	ucidef_add_gpio_switch "poe_power_port3" "PoE Power Port3" "499"
> +	ucidef_add_gpio_switch "poe_power_port4" "PoE Power Port4" "500"
> +	;;
> +esac
> +
> +board_config_flush
> +
> +exit 0
> diff --git a/target/linux/ramips/base-files/lib/ramips.sh b/target/linux/ramips/base-files/lib/ramips.sh
> index 87cb7ff..b5f0617 100755
> --- a/target/linux/ramips/base-files/lib/ramips.sh
> +++ b/target/linux/ramips/base-files/lib/ramips.sh
> @@ -481,6 +481,9 @@ ramips_board_detect() {
>  	*"UBNT-ERX")
>  		name="ubnt-erx"
>  		;;
> +	*"UBNT-ERX-SFP")
> +		name="ubnt-erx-sfp"
> +		;;
>  	*"UR-326N4G")
>  		name="ur-326n4g"
>  		;;
> diff --git a/target/linux/ramips/base-files/lib/upgrade/platform.sh b/target/linux/ramips/base-files/lib/upgrade/platform.sh
> index adad8da..d8a7c08 100755
> --- a/target/linux/ramips/base-files/lib/upgrade/platform.sh
> +++ b/target/linux/ramips/base-files/lib/upgrade/platform.sh
> @@ -249,7 +249,8 @@ platform_check_image() {
>  		# these boards use metadata images
>  		return 0
>  		;;
> -	ubnt-erx)
> +	ubnt-erx|\
> +	ubnt-erx-sfp)
>  		nand_do_platform_check "$board" "$1"
>  		return $?;
>  		;;
> @@ -271,7 +272,8 @@ platform_nand_pre_upgrade() {
>  	local board=$(ramips_board_name)
>  
>  	case "$board" in
> -	ubnt-erx)
> +	ubnt-erx|\
> +	ubnt-erx-sfp)
>  		platform_upgrade_ubnt_erx "$ARGV"
>  		;;
>  	esac
> @@ -283,7 +285,8 @@ platform_pre_upgrade() {
>  	case "$board" in
>  	hc5962|\
>  	r6220|\
> -    	ubnt-erx)
> +	ubnt-erx|\
> +	ubnt-erx-sfp)
>  		nand_do_upgrade "$ARGV"
>  		;;
>  	esac
> diff --git a/target/linux/ramips/dts/UBNT-ERX-SFP.dts b/target/linux/ramips/dts/UBNT-ERX-SFP.dts
> new file mode 100644
> index 0000000..69599fe
> --- /dev/null
> +++ b/target/linux/ramips/dts/UBNT-ERX-SFP.dts
> @@ -0,0 +1,24 @@
> +/dts-v1/;
> +
> +#include "UBNT-ERX.dtsi"
> +
> +#include <dt-bindings/gpio/gpio.h>
> +
> +/ {
> +	model = "UBNT-ERX-SFP";
> +	compatible = "ubiquiti,edgerouterx-sfp";
> +
> +	i2c-gpio {
> +		compatible = "i2c-gpio";
> +		gpios = <&gpio0 3 GPIO_ACTIVE_HIGH /* sda */
> +		         &gpio0 4 GPIO_ACTIVE_HIGH /* scl */
> +		        >;
> +		#address-cells = <1>;
> +		#size-cells = <0>;
> +
> +		pca9555@25 {
> +			compatible = "pca9555";
> +			reg = <0x25>;
> +		};
> +	};
> +};
> diff --git a/target/linux/ramips/dts/UBNT-ERX.dts b/target/linux/ramips/dts/UBNT-ERX.dts
> index 0b2da95..7715162 100644
> --- a/target/linux/ramips/dts/UBNT-ERX.dts
> +++ b/target/linux/ramips/dts/UBNT-ERX.dts
> @@ -1,107 +1,7 @@
> -#include <dt-bindings/input/input.h>
> -
>  /dts-v1/;
>  
> -#include "mt7621.dtsi"
> +#include "UBNT-ERX.dtsi"
>  
>  / {
>  	model = "UBNT-ERX";
> -
> -	memory@0 {
> -		device_type = "memory";
> -		reg = <0x0 0x10000000>;
> -	};
> -
> -	chosen {
> -		bootargs = "console=ttyS0,57600";
> -	};
> -
> -	gpio-keys-polled {
> -		compatible = "gpio-keys-polled";
> -		#address-cells = <1>;
> -		#size-cells = <0>;
> -		poll-interval = <20>;
> -
> -		reset {
> -			label = "reset";
> -			gpios = <&gpio0 12 1>;
> -			linux,code = <KEY_RESTART>;
> -		};
> -	};
> -};
> -
> -&ethernet {
> -	mtd-mac-address = <&factory 0x22>;
> -};
> -
> -&nand {
> -	status = "okay";
> -
> -	partition@0 {
> -		label = "u-boot";
> -		reg = <0x0 0x80000>;
> -		read-only;
> -	};
> -
> -	partition@80000 {
> -		label = "u-boot-env";
> -		reg = <0x80000 0x60000>;
> -		read-only;
> -	};
> -
> -	factory: partition@e0000 {
> -		label = "factory";
> -		reg = <0xe0000 0x60000>;
> -	};
> -
> -	partition@140000 {
> -		label = "kernel1";
> -		reg = <0x140000 0x300000>;
> -	};
> -
> -	partition@440000 {
> -		label = "kernel2";
> -		reg = <0x440000 0x300000>;
> -	};
> -
> -	partition@740000 {
> -		label = "ubi";
> -		reg = <0x740000 0xf7c0000>;
> -	};
> -};
> -
> -&pinctrl {
> -	state_default: pinctrl0 {
> -		gpio {
> -			ralink,group = "uart2", "uart3", "i2c", "pcie", "rgmii2", "jtag";
> -			ralink,function = "gpio";
> -		};
> -	};
> -};
> -
> -&spi0 {
> -	/* This board has 2Mb spi flash soldered in and visible
> -	   from manufacturer's firmware.
> -	   But this SoC shares spi and nand pins,
> -	   and current driver does't handle this sharing well */
> -	status = "disabled";
> -
> -	m25p80@0 {
> -		#address-cells = <1>;
> -		#size-cells = <1>;
> -		compatible = "jedec,spi-nor";
> -		reg = <1>;
> -		spi-max-frequency = <10000000>;
> -		m25p,chunked-io = <32>;
> -
> -		partition@0 {
> -			label = "spi";
> -			reg = <0x0 0x200000>;
> -			read-only;
> -		};
> -	};
> -};
> -
> -&xhci {
> -	status = "disabled";
>  };
> diff --git a/target/linux/ramips/dts/UBNT-ERX.dtsi b/target/linux/ramips/dts/UBNT-ERX.dtsi
> new file mode 100644
> index 0000000..b38c719
> --- /dev/null
> +++ b/target/linux/ramips/dts/UBNT-ERX.dtsi
> @@ -0,0 +1,106 @@
> +#include "mt7621.dtsi"
> +
> +#include <dt-bindings/gpio/gpio.h>
> +#include <dt-bindings/input/input.h>
> +
> +/ {
> +	compatible = "ubiquiti,edgerouterx";
> +
> +	memory@0 {
> +		device_type = "memory";
> +		reg = <0x0 0x10000000>;
> +	};
> +
> +	chosen {
> +		bootargs = "console=ttyS0,57600";
> +	};
> +
> +	gpio-keys-polled {
> +		compatible = "gpio-keys-polled";
> +		#address-cells = <1>;
> +		#size-cells = <0>;
> +		poll-interval = <20>;
> +
> +		reset {
> +			label = "reset";
> +			gpios = <&gpio0 12 GPIO_ACTIVE_LOW>;
> +			linux,code = <KEY_RESTART>;
> +		};
> +	};
> +};
> +
> +&ethernet {
> +	mtd-mac-address = <&factory 0x22>;
> +};
> +
> +&nand {
> +	status = "okay";
> +
> +	partition@0 {
> +		label = "u-boot";
> +		reg = <0x0 0x80000>;
> +		read-only;
> +	};
> +
> +	partition@80000 {
> +		label = "u-boot-env";
> +		reg = <0x80000 0x60000>;
> +		read-only;
> +	};
> +
> +	factory: partition@e0000 {
> +		label = "factory";
> +		reg = <0xe0000 0x60000>;
> +	};
> +
> +	partition@140000 {
> +		label = "kernel1";
> +		reg = <0x140000 0x300000>;
> +	};
> +
> +	partition@440000 {
> +		label = "kernel2";
> +		reg = <0x440000 0x300000>;
> +	};
> +
> +	partition@740000 {
> +		label = "ubi";
> +		reg = <0x740000 0xf7c0000>;
> +	};
> +};
> +
> +&pinctrl {
> +	state_default: pinctrl0 {
> +		gpio {
> +			ralink,group = "uart2", "uart3", "i2c", "pcie", "rgmii2", "jtag";
> +			ralink,function = "gpio";
> +		};
> +	};
> +};
> +
> +&spi0 {
> +	/* This board has 2Mb spi flash soldered in and visible
> +	   from manufacturer's firmware.
> +	   But this SoC shares spi and nand pins,
> +	   and current driver does't handle this sharing well */
> +	status = "disabled";
> +
> +	m25p80@0 {
> +		#address-cells = <1>;
> +		#size-cells = <1>;
> +		compatible = "jedec,spi-nor";
> +		reg = <1>;
> +		spi-max-frequency = <10000000>;
> +		m25p,chunked-io = <32>;
> +
> +		partition@0 {
> +			label = "spi";
> +			reg = <0x0 0x200000>;
> +			read-only;
> +		};
> +	};
> +};
> +
> +&xhci {
> +	status = "disabled";
> +};
> diff --git a/target/linux/ramips/image/mt7621.mk b/target/linux/ramips/image/mt7621.mk
> index b57552a..f65449a 100644
> --- a/target/linux/ramips/image/mt7621.mk
> +++ b/target/linux/ramips/image/mt7621.mk
> @@ -176,6 +176,19 @@ define Device/ubnt-erx
>  endef
>  TARGET_DEVICES += ubnt-erx
>  
> +define Device/ubnt-erx-sfp
> +  DTS := UBNT-ERX-SFP
> +  FILESYSTEMS := squashfs
> +  KERNEL_SIZE := 3145728
> +  KERNEL := $(KERNEL_DTB) | uImage lzma
> +  IMAGES := sysupgrade.tar
> +  KERNEL_INITRAMFS := $$(KERNEL) | ubnt-erx-factory-image $(KDIR)/tmp/$$(KERNEL_INITRAMFS_PREFIX)-factory.tar
> +  IMAGE/sysupgrade.tar := sysupgrade-tar | append-metadata
> +  DEVICE_TITLE := Ubiquiti EdgeRouter X-SFP
> +  DEVICE_PACKAGES := -kmod-mt76 -kmod-rt2x00-lib -kmod-mac80211 -kmod-cfg80211 -wpad-mini -iwinfo kmod-i2c-algo-pca kmod-gpio-pca953x kmod-i2c-gpio-custom
> +endef
> +TARGET_DEVICES += ubnt-erx-sfp
> +
>  define Device/vr500
>    DTS := VR500
>    IMAGE_SIZE := 66453504
>
diff mbox

Patch

diff --git a/target/linux/ramips/base-files/etc/board.d/02_network b/target/linux/ramips/base-files/etc/board.d/02_network
index 80a3bc2..490a41e 100755
--- a/target/linux/ramips/base-files/etc/board.d/02_network
+++ b/target/linux/ramips/base-files/etc/board.d/02_network
@@ -165,6 +165,7 @@  ramips_setup_interfaces()
 	rb750gr3|\
 	rt-n14u|\
 	ubnt-erx|\
+	ubnt-erx-sfp|\
 	ur-326n4g|\
 	wrtnode|\
 	wrtnode2p | \
diff --git a/target/linux/ramips/base-files/etc/board.d/03_gpio_switches b/target/linux/ramips/base-files/etc/board.d/03_gpio_switches
new file mode 100755
index 0000000..859dfb3
--- /dev/null
+++ b/target/linux/ramips/base-files/etc/board.d/03_gpio_switches
@@ -0,0 +1,25 @@ 
+#!/bin/sh
+
+. /lib/functions/uci-defaults.sh
+. /lib/ramips.sh
+
+board_config_update
+
+board=$(ramips_board_name)
+
+case "$board" in
+ubnt-erx)
+	ucidef_add_gpio_switch "poe_passthrough" "PoE Passthrough" "0"
+	;;
+ubnt-erx-sfp)
+	ucidef_add_gpio_switch "poe_power_port0" "PoE Power Port0" "496"
+	ucidef_add_gpio_switch "poe_power_port1" "PoE Power Port1" "497"
+	ucidef_add_gpio_switch "poe_power_port2" "PoE Power Port2" "498"
+	ucidef_add_gpio_switch "poe_power_port3" "PoE Power Port3" "499"
+	ucidef_add_gpio_switch "poe_power_port4" "PoE Power Port4" "500"
+	;;
+esac
+
+board_config_flush
+
+exit 0
diff --git a/target/linux/ramips/base-files/lib/ramips.sh b/target/linux/ramips/base-files/lib/ramips.sh
index 87cb7ff..b5f0617 100755
--- a/target/linux/ramips/base-files/lib/ramips.sh
+++ b/target/linux/ramips/base-files/lib/ramips.sh
@@ -481,6 +481,9 @@  ramips_board_detect() {
 	*"UBNT-ERX")
 		name="ubnt-erx"
 		;;
+	*"UBNT-ERX-SFP")
+		name="ubnt-erx-sfp"
+		;;
 	*"UR-326N4G")
 		name="ur-326n4g"
 		;;
diff --git a/target/linux/ramips/base-files/lib/upgrade/platform.sh b/target/linux/ramips/base-files/lib/upgrade/platform.sh
index adad8da..d8a7c08 100755
--- a/target/linux/ramips/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ramips/base-files/lib/upgrade/platform.sh
@@ -249,7 +249,8 @@  platform_check_image() {
 		# these boards use metadata images
 		return 0
 		;;
-	ubnt-erx)
+	ubnt-erx|\
+	ubnt-erx-sfp)
 		nand_do_platform_check "$board" "$1"
 		return $?;
 		;;
@@ -271,7 +272,8 @@  platform_nand_pre_upgrade() {
 	local board=$(ramips_board_name)
 
 	case "$board" in
-	ubnt-erx)
+	ubnt-erx|\
+	ubnt-erx-sfp)
 		platform_upgrade_ubnt_erx "$ARGV"
 		;;
 	esac
@@ -283,7 +285,8 @@  platform_pre_upgrade() {
 	case "$board" in
 	hc5962|\
 	r6220|\
-    	ubnt-erx)
+	ubnt-erx|\
+	ubnt-erx-sfp)
 		nand_do_upgrade "$ARGV"
 		;;
 	esac
diff --git a/target/linux/ramips/dts/UBNT-ERX-SFP.dts b/target/linux/ramips/dts/UBNT-ERX-SFP.dts
new file mode 100644
index 0000000..69599fe
--- /dev/null
+++ b/target/linux/ramips/dts/UBNT-ERX-SFP.dts
@@ -0,0 +1,24 @@ 
+/dts-v1/;
+
+#include "UBNT-ERX.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+
+/ {
+	model = "UBNT-ERX-SFP";
+	compatible = "ubiquiti,edgerouterx-sfp";
+
+	i2c-gpio {
+		compatible = "i2c-gpio";
+		gpios = <&gpio0 3 GPIO_ACTIVE_HIGH /* sda */
+		         &gpio0 4 GPIO_ACTIVE_HIGH /* scl */
+		        >;
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		pca9555@25 {
+			compatible = "pca9555";
+			reg = <0x25>;
+		};
+	};
+};
diff --git a/target/linux/ramips/dts/UBNT-ERX.dts b/target/linux/ramips/dts/UBNT-ERX.dts
index 0b2da95..7715162 100644
--- a/target/linux/ramips/dts/UBNT-ERX.dts
+++ b/target/linux/ramips/dts/UBNT-ERX.dts
@@ -1,107 +1,7 @@ 
-#include <dt-bindings/input/input.h>
-
 /dts-v1/;
 
-#include "mt7621.dtsi"
+#include "UBNT-ERX.dtsi"
 
 / {
 	model = "UBNT-ERX";
-
-	memory@0 {
-		device_type = "memory";
-		reg = <0x0 0x10000000>;
-	};
-
-	chosen {
-		bootargs = "console=ttyS0,57600";
-	};
-
-	gpio-keys-polled {
-		compatible = "gpio-keys-polled";
-		#address-cells = <1>;
-		#size-cells = <0>;
-		poll-interval = <20>;
-
-		reset {
-			label = "reset";
-			gpios = <&gpio0 12 1>;
-			linux,code = <KEY_RESTART>;
-		};
-	};
-};
-
-&ethernet {
-	mtd-mac-address = <&factory 0x22>;
-};
-
-&nand {
-	status = "okay";
-
-	partition@0 {
-		label = "u-boot";
-		reg = <0x0 0x80000>;
-		read-only;
-	};
-
-	partition@80000 {
-		label = "u-boot-env";
-		reg = <0x80000 0x60000>;
-		read-only;
-	};
-
-	factory: partition@e0000 {
-		label = "factory";
-		reg = <0xe0000 0x60000>;
-	};
-
-	partition@140000 {
-		label = "kernel1";
-		reg = <0x140000 0x300000>;
-	};
-
-	partition@440000 {
-		label = "kernel2";
-		reg = <0x440000 0x300000>;
-	};
-
-	partition@740000 {
-		label = "ubi";
-		reg = <0x740000 0xf7c0000>;
-	};
-};
-
-&pinctrl {
-	state_default: pinctrl0 {
-		gpio {
-			ralink,group = "uart2", "uart3", "i2c", "pcie", "rgmii2", "jtag";
-			ralink,function = "gpio";
-		};
-	};
-};
-
-&spi0 {
-	/* This board has 2Mb spi flash soldered in and visible
-	   from manufacturer's firmware.
-	   But this SoC shares spi and nand pins,
-	   and current driver does't handle this sharing well */
-	status = "disabled";
-
-	m25p80@0 {
-		#address-cells = <1>;
-		#size-cells = <1>;
-		compatible = "jedec,spi-nor";
-		reg = <1>;
-		spi-max-frequency = <10000000>;
-		m25p,chunked-io = <32>;
-
-		partition@0 {
-			label = "spi";
-			reg = <0x0 0x200000>;
-			read-only;
-		};
-	};
-};
-
-&xhci {
-	status = "disabled";
 };
diff --git a/target/linux/ramips/dts/UBNT-ERX.dtsi b/target/linux/ramips/dts/UBNT-ERX.dtsi
new file mode 100644
index 0000000..b38c719
--- /dev/null
+++ b/target/linux/ramips/dts/UBNT-ERX.dtsi
@@ -0,0 +1,106 @@ 
+#include "mt7621.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+	compatible = "ubiquiti,edgerouterx";
+
+	memory@0 {
+		device_type = "memory";
+		reg = <0x0 0x10000000>;
+	};
+
+	chosen {
+		bootargs = "console=ttyS0,57600";
+	};
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+
+		reset {
+			label = "reset";
+			gpios = <&gpio0 12 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_RESTART>;
+		};
+	};
+};
+
+&ethernet {
+	mtd-mac-address = <&factory 0x22>;
+};
+
+&nand {
+	status = "okay";
+
+	partition@0 {
+		label = "u-boot";
+		reg = <0x0 0x80000>;
+		read-only;
+	};
+
+	partition@80000 {
+		label = "u-boot-env";
+		reg = <0x80000 0x60000>;
+		read-only;
+	};
+
+	factory: partition@e0000 {
+		label = "factory";
+		reg = <0xe0000 0x60000>;
+	};
+
+	partition@140000 {
+		label = "kernel1";
+		reg = <0x140000 0x300000>;
+	};
+
+	partition@440000 {
+		label = "kernel2";
+		reg = <0x440000 0x300000>;
+	};
+
+	partition@740000 {
+		label = "ubi";
+		reg = <0x740000 0xf7c0000>;
+	};
+};
+
+&pinctrl {
+	state_default: pinctrl0 {
+		gpio {
+			ralink,group = "uart2", "uart3", "i2c", "pcie", "rgmii2", "jtag";
+			ralink,function = "gpio";
+		};
+	};
+};
+
+&spi0 {
+	/* This board has 2Mb spi flash soldered in and visible
+	   from manufacturer's firmware.
+	   But this SoC shares spi and nand pins,
+	   and current driver does't handle this sharing well */
+	status = "disabled";
+
+	m25p80@0 {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		compatible = "jedec,spi-nor";
+		reg = <1>;
+		spi-max-frequency = <10000000>;
+		m25p,chunked-io = <32>;
+
+		partition@0 {
+			label = "spi";
+			reg = <0x0 0x200000>;
+			read-only;
+		};
+	};
+};
+
+&xhci {
+	status = "disabled";
+};
diff --git a/target/linux/ramips/image/mt7621.mk b/target/linux/ramips/image/mt7621.mk
index b57552a..f65449a 100644
--- a/target/linux/ramips/image/mt7621.mk
+++ b/target/linux/ramips/image/mt7621.mk
@@ -176,6 +176,19 @@  define Device/ubnt-erx
 endef
 TARGET_DEVICES += ubnt-erx
 
+define Device/ubnt-erx-sfp
+  DTS := UBNT-ERX-SFP
+  FILESYSTEMS := squashfs
+  KERNEL_SIZE := 3145728
+  KERNEL := $(KERNEL_DTB) | uImage lzma
+  IMAGES := sysupgrade.tar
+  KERNEL_INITRAMFS := $$(KERNEL) | ubnt-erx-factory-image $(KDIR)/tmp/$$(KERNEL_INITRAMFS_PREFIX)-factory.tar
+  IMAGE/sysupgrade.tar := sysupgrade-tar | append-metadata
+  DEVICE_TITLE := Ubiquiti EdgeRouter X-SFP
+  DEVICE_PACKAGES := -kmod-mt76 -kmod-rt2x00-lib -kmod-mac80211 -kmod-cfg80211 -wpad-mini -iwinfo kmod-i2c-algo-pca kmod-gpio-pca953x kmod-i2c-gpio-custom
+endef
+TARGET_DEVICES += ubnt-erx-sfp
+
 define Device/vr500
   DTS := VR500
   IMAGE_SIZE := 66453504