From 46c5de53856d97a1a926a272acc76a9af654f320 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Rodolphe=20de=20Saint=20L=C3=A9ger?=
 <rdesaintleger@gmail.com>
Date: Wed, 16 Mar 2022 10:19:30 +0100
Subject: [PATCH] ramips: add support for Netgear WN3100RPv2
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

This patch adds support for the Netgear WN3100RPv2
http://www.netgear.com/support/product/wn3100rpv2.aspx

Specifications:
- SoC: MediaTek MT7620A (580MHz, ramips)
- RAM: 32MB DDR
- Storage: 8MB NOR SPI flash
- Wireless: builtin MT7620A, 2x2:2 with u.FL connectors
- Ethernet: 1x100M
- Stock firmware based on OpenWRT Kamikaze

Like the EX2700, the bootloader expects a secondary image signature,
see https://forum.openwrt.org/viewtopic.php?pid=312577#p312577

This device seems to be same hardware as a WN3000RPv3

Flash instructions:
- Use the Netgear WebUI to upgrade to OpenWRT using the factory image
  (see note below),
- Use the sysupgrade image for upgrading versions from OpenWRT,
- TFTP recovery procedure can be used to flash the factory image
  (preferred method).

Note:
- The WebUI may not reboot automatically, wait at least 5 minutes before
  powercycling the device

Flashing using TFTP:
- Set you IP address to 192.168.1.10/24 (no gateway)
- Connect your machine to the Ethernet port
- Power off the device and wait for 10 seconds,
- Hold the reset button and power on the device (do not release reset),
- Hold the reset button until the green light is flashing (Approx. 15s)
- launch tftp, set mode to binary and connect to 192.168.1.1
- put the factory firmware image
- All leds will switch off (like a power off), this is normal
- Wait for the device to reboot in the new OpenWRT image (max 5 mins)
- The first boot will take longer than usual.
- After boot, the Device IP on the ethernet port is 192.168.1.1

Signed-off-by: Rodolphe de Saint Léger <rdesaintleger@gmail.com>
[drop unneeded includes in dts, wrap commit message]
Signed-off-by: Sungbo Eo <mans0n@gorani.run>
---
 .../dts/mt7620a_netgear_wn3000rp-v3.dts       | 155 +----------------
 .../dts/mt7620a_netgear_wn3100rp-v2.dts       |   8 +
 .../ramips/dts/mt7620a_netgear_wn3x00rp.dtsi  | 158 ++++++++++++++++++
 target/linux/ramips/image/mt7620.mk           |  16 ++
 .../mt7620/base-files/etc/board.d/01_leds     |   3 +-
 .../mt7620/base-files/etc/board.d/02_network  |   1 +
 6 files changed, 186 insertions(+), 155 deletions(-)
 create mode 100644 target/linux/ramips/dts/mt7620a_netgear_wn3100rp-v2.dts
 create mode 100644 target/linux/ramips/dts/mt7620a_netgear_wn3x00rp.dtsi

diff --git a/target/linux/ramips/dts/mt7620a_netgear_wn3000rp-v3.dts b/target/linux/ramips/dts/mt7620a_netgear_wn3000rp-v3.dts
index c6fe7baa67..cddffb7224 100644
--- a/target/linux/ramips/dts/mt7620a_netgear_wn3000rp-v3.dts
+++ b/target/linux/ramips/dts/mt7620a_netgear_wn3000rp-v3.dts
@@ -1,161 +1,8 @@
 /* This file is released into the public domain */
 
-#include "mt7620a.dtsi"
-
-#include <dt-bindings/gpio/gpio.h>
-#include <dt-bindings/input/input.h>
+#include "mt7620a_netgear_wn3x00rp.dtsi"
 
 / {
 	compatible = "netgear,wn3000rp-v3", "ralink,mt7620a-soc";
 	model = "Netgear WN3000RP v3";
-
-	aliases {
-		led-boot = &led_power_green;
-		led-failsafe = &led_power_green;
-		led-running = &led_power_green;
-		led-upgrade = &led_power_green;
-	};
-
-	keys {
-		compatible = "gpio-keys";
-
-		reset {
-			label = "reset";
-			gpios = <&gpio0 1 GPIO_ACTIVE_LOW>;
-			linux,code = <KEY_RESTART>;
-		};
-
-		wps {
-			label = "wps";
-			gpios = <&gpio0 2 GPIO_ACTIVE_LOW>;
-			linux,code = <KEY_WPS_BUTTON>;
-		};
-	};
-
-	leds {
-		compatible = "gpio-leds";
-
-		led_power_green: power_g {
-			label = "green:power";
-			gpios = <&gpio0 9 GPIO_ACTIVE_LOW>;
-			default-state = "on";
-		};
-
-		power_r {
-			label = "red:power";
-			gpios = <&gpio0 11 GPIO_ACTIVE_LOW>;
-		};
-
-		client_g {
-			label = "green:client";
-			gpios = <&gpio0 13 GPIO_ACTIVE_LOW>;
-		};
-
-		client_r {
-			label = "red:client";
-			gpios = <&gpio0 10 GPIO_ACTIVE_LOW>;
-		};
-
-		router_g {
-			label = "green:router";
-			gpios = <&gpio0 12 GPIO_ACTIVE_LOW>;
-		};
-
-		router_r {
-			label = "red:router";
-			gpios = <&gpio0 14 GPIO_ACTIVE_LOW>;
-		};
-
-		wps {
-			label = "green:wps";
-			gpios = <&gpio1 15 GPIO_ACTIVE_LOW>;
-		};
-
-		l_arrow {
-			label = "blue:leftarrow";
-			gpios = <&gpio0 7 GPIO_ACTIVE_LOW>;
-		};
-
-		r_arrow {
-			label = "blue:rightarrow";
-			gpios = <&gpio0 8 GPIO_ACTIVE_LOW>;
-		};
-	};
-};
-
-&gpio1 {
-	status = "okay";
-};
-
-&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 0x30000>;
-				read-only;
-			};
-
-			partition@30000 {
-				label = "u-boot-env";
-				reg = <0x30000 0x10000>;
-				read-only;
-			};
-
-			partition@40000 {
-				compatible = "denx,uimage";
-				label = "firmware";
-				reg = <0x40000 0x7b0000>;
-			};
-
-			art: partition@7f0000 {
-				label = "art";
-				reg = <0x7f0000 0x10000>;
-				read-only;
-			};
-		};
-	};
-};
-
-&ethernet {
-	nvmem-cells = <&macaddr_art_0>;
-	nvmem-cell-names = "mac-address";
-};
-
-&wmac {
-	ralink,mtd-eeprom = <&art 0x1000>;
-
-	nvmem-cells = <&macaddr_art_6>;
-	nvmem-cell-names = "mac-address";
-};
-
-&state_default {
-	default {
-		groups = "i2c", "uartf", "spi refclk";
-		function = "gpio";
-	};
-};
-
-&art {
-	compatible = "nvmem-cells";
-	#address-cells = <1>;
-	#size-cells = <1>;
-
-	macaddr_art_0: macaddr@0 {
-		reg = <0x0 0x6>;
-	};
-
-	macaddr_art_6: macaddr@6 {
-		reg = <0x6 0x6>;
-	};
 };
diff --git a/target/linux/ramips/dts/mt7620a_netgear_wn3100rp-v2.dts b/target/linux/ramips/dts/mt7620a_netgear_wn3100rp-v2.dts
new file mode 100644
index 0000000000..af4a73bade
--- /dev/null
+++ b/target/linux/ramips/dts/mt7620a_netgear_wn3100rp-v2.dts
@@ -0,0 +1,8 @@
+/* This file is released into the public domain */
+
+#include "mt7620a_netgear_wn3x00rp.dtsi"
+
+/ {
+	compatible = "netgear,wn3100rp-v2", "ralink,mt7620a-soc";
+	model = "Netgear WN3100RP v2";
+};
diff --git a/target/linux/ramips/dts/mt7620a_netgear_wn3x00rp.dtsi b/target/linux/ramips/dts/mt7620a_netgear_wn3x00rp.dtsi
new file mode 100644
index 0000000000..914d4e6bba
--- /dev/null
+++ b/target/linux/ramips/dts/mt7620a_netgear_wn3x00rp.dtsi
@@ -0,0 +1,158 @@
+/* This file is released into the public domain */
+
+#include "mt7620a.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+	aliases {
+		led-boot = &led_power_green;
+		led-failsafe = &led_power_green;
+		led-running = &led_power_green;
+		led-upgrade = &led_power_green;
+	};
+
+	keys {
+		compatible = "gpio-keys";
+
+		reset {
+			label = "reset";
+			gpios = <&gpio0 1 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_RESTART>;
+		};
+
+		wps {
+			label = "wps";
+			gpios = <&gpio0 2 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_WPS_BUTTON>;
+		};
+	};
+
+	leds {
+		compatible = "gpio-leds";
+
+		led_power_green: power_g {
+			label = "green:power";
+			gpios = <&gpio0 9 GPIO_ACTIVE_LOW>;
+			default-state = "on";
+		};
+
+		power_r {
+			label = "red:power";
+			gpios = <&gpio0 11 GPIO_ACTIVE_LOW>;
+		};
+
+		client_g {
+			label = "green:client";
+			gpios = <&gpio0 13 GPIO_ACTIVE_LOW>;
+		};
+
+		client_r {
+			label = "red:client";
+			gpios = <&gpio0 10 GPIO_ACTIVE_LOW>;
+		};
+
+		router_g {
+			label = "green:router";
+			gpios = <&gpio0 12 GPIO_ACTIVE_LOW>;
+		};
+
+		router_r {
+			label = "red:router";
+			gpios = <&gpio0 14 GPIO_ACTIVE_LOW>;
+		};
+
+		wps {
+			label = "green:wps";
+			gpios = <&gpio1 15 GPIO_ACTIVE_LOW>;
+		};
+
+		l_arrow {
+			label = "blue:leftarrow";
+			gpios = <&gpio0 7 GPIO_ACTIVE_LOW>;
+		};
+
+		r_arrow {
+			label = "blue:rightarrow";
+			gpios = <&gpio0 8 GPIO_ACTIVE_LOW>;
+		};
+	};
+};
+
+&gpio1 {
+	status = "okay";
+};
+
+&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 0x30000>;
+				read-only;
+			};
+
+			partition@30000 {
+				label = "u-boot-env";
+				reg = <0x30000 0x10000>;
+				read-only;
+			};
+
+			partition@40000 {
+				compatible = "denx,uimage";
+				label = "firmware";
+				reg = <0x40000 0x7b0000>;
+			};
+
+			art: partition@7f0000 {
+				label = "art";
+				reg = <0x7f0000 0x10000>;
+				read-only;
+			};
+		};
+	};
+};
+
+&ethernet {
+	nvmem-cells = <&macaddr_art_0>;
+	nvmem-cell-names = "mac-address";
+};
+
+&wmac {
+	ralink,mtd-eeprom = <&art 0x1000>;
+
+	nvmem-cells = <&macaddr_art_6>;
+	nvmem-cell-names = "mac-address";
+};
+
+&state_default {
+	default {
+		groups = "i2c", "uartf", "spi refclk";
+		function = "gpio";
+	};
+};
+
+&art {
+	compatible = "nvmem-cells";
+	#address-cells = <1>;
+	#size-cells = <1>;
+
+	macaddr_art_0: macaddr@0 {
+		reg = <0x0 0x6>;
+	};
+
+	macaddr_art_6: macaddr@6 {
+		reg = <0x6 0x6>;
+	};
+};
diff --git a/target/linux/ramips/image/mt7620.mk b/target/linux/ramips/image/mt7620.mk
index 49d25b947f..d2a2c90460 100644
--- a/target/linux/ramips/image/mt7620.mk
+++ b/target/linux/ramips/image/mt7620.mk
@@ -819,6 +819,22 @@ define Device/netgear_wn3000rp-v3
 endef
 TARGET_DEVICES += netgear_wn3000rp-v3
 
+define Device/netgear_wn3100rp-v2
+  SOC := mt7620a
+  IMAGE_SIZE := 7872k
+  NETGEAR_HW_ID := 29764883+8+0+32+2x2+0
+  NETGEAR_BOARD_ID := WN3100RPv2
+  BLOCKSIZE := 4k
+  IMAGES += factory.bin
+  KERNEL := $(KERNEL_DTB) | uImage lzma | pad-offset 64k 64 | \
+	append-uImage-fakehdr filesystem
+  IMAGE/factory.bin := $$(sysupgrade_bin) | check-size | netgear-dni
+  DEVICE_VENDOR := NETGEAR
+  DEVICE_MODEL := WN3100RP
+  DEVICE_VARIANT := v2
+endef
+TARGET_DEVICES += netgear_wn3100rp-v2
+
 define Device/netis_wf2770
   SOC := mt7620a
   IMAGE_SIZE := 16064k
diff --git a/target/linux/ramips/mt7620/base-files/etc/board.d/01_leds b/target/linux/ramips/mt7620/base-files/etc/board.d/01_leds
index 5f105bd834..1293c34cbf 100644
--- a/target/linux/ramips/mt7620/base-files/etc/board.d/01_leds
+++ b/target/linux/ramips/mt7620/base-files/etc/board.d/01_leds
@@ -161,7 +161,8 @@ lenovo,newifi-y1s)
 	ucidef_set_led_netdev "wan" "WAN" "blue:internet" "eth0.2" "tx rx"
 	;;
 netgear,ex2700|\
-netgear,wn3000rp-v3)
+netgear,wn3000rp-v3|\
+netgear,wn3100rp-v2)
 	ucidef_set_led_netdev "wifi_led" "wifi" "green:router" "wlan0"
 	;;
 netgear,ex3700|\
diff --git a/target/linux/ramips/mt7620/base-files/etc/board.d/02_network b/target/linux/ramips/mt7620/base-files/etc/board.d/02_network
index 3ed72fa3ab..f7bc41669f 100644
--- a/target/linux/ramips/mt7620/base-files/etc/board.d/02_network
+++ b/target/linux/ramips/mt7620/base-files/etc/board.d/02_network
@@ -54,6 +54,7 @@ ramips_setup_interfaces()
 	netgear,ex6120|\
 	netgear,ex6130|\
 	netgear,wn3000rp-v3|\
+	netgear,wn3100rp-v2|\
 	planex,cs-qr10|\
 	planex,mzk-ex300np|\
 	planex,mzk-ex750np|\
-- 
2.30.2