[v2,4/4] Add support for TP-Link C25

Submitted by Tim Niemeyer on July 8, 2017, 11 a.m.

Details

Message ID 1499511609-30508-4-git-send-email-tim@tn-x.org
State Accepted
Headers show

Commit Message

Tim Niemeyer July 8, 2017, 11 a.m.
Signed-off-by: Tim Niemeyer <tim@tn-x.org>
---

Changes in v2:
- Added kernel config for LEDs
- Changed patch format

 bsp/ar71xx/.config                                 |   3 +
 bsp/board_ar71xx.bsp                               |   1 +
 ...ils-tplink-safeloader-support-strings-as-.patch | 162 +++++++
 ...1xx-add-support-for-TP-Link-Archer-C25-v1.patch | 499 +++++++++++++++++++++
 ...ils-tplink-safeloader-add-TP-Link-Archer-.patch | 112 +++++
 src/packages/fff/fff-network/Makefile              |   2 +-
 .../fff/fff-network/ar71xx/network.archer-c25-v1   |   8 +
 7 files changed, 786 insertions(+), 1 deletion(-)
 create mode 100644 build_patches/openwrt/0005-firmware-utils-tplink-safeloader-support-strings-as-.patch
 create mode 100644 build_patches/openwrt/0006-ar71xx-add-support-for-TP-Link-Archer-C25-v1.patch
 create mode 100644 build_patches/openwrt/0007-firmware-utils-tplink-safeloader-add-TP-Link-Archer-.patch
 create mode 100644 src/packages/fff/fff-network/ar71xx/network.archer-c25-v1

Patch hide | download patch | download mbox

diff --git a/bsp/ar71xx/.config b/bsp/ar71xx/.config
index 43d063c..b407f7d 100644
--- a/bsp/ar71xx/.config
+++ b/bsp/ar71xx/.config
@@ -6,6 +6,8 @@  CONFIG_TARGET_ar71xx_generic=y
 CONFIG_TARGET_MULTI_PROFILE=y
 CONFIG_TARGET_DEVICE_ar71xx_generic_DEVICE_gl-ar150=y
 CONFIG_TARGET_DEVICE_PACKAGES_ar71xx_generic_DEVICE_gl-ar150=""
+CONFIG_TARGET_DEVICE_ar71xx_generic_DEVICE_archer-c25-v1=y
+CONFIG_TARGET_DEVICE_PACKAGES_ar71xx_generic_DEVICE_archer-c25-v1="-kmod-ath10k kmod-ath10k-ct -ath10k-firmware-qca9887 ath10k-firmware-qca9887-ct"
 CONFIG_TARGET_DEVICE_ar71xx_generic_DEVICE_archer-c7-v2=y
 CONFIG_TARGET_DEVICE_PACKAGES_ar71xx_generic_DEVICE_archer-c7-v2="-kmod-ath10k kmod-ath10k-ct -ath10k-firmware-qca988x ath10k-firmware-qca988x-ct"
 CONFIG_TARGET_DEVICE_ar71xx_generic_DEVICE_cpe210-220=y
@@ -83,6 +85,7 @@  CONFIG_CLEAN_IPKG=y
 # CONFIG_KERNEL_DEBUG_INFO is not set
 # CONFIG_KERNEL_DEBUG_KERNEL is not set
 # CONFIG_PACKAGE_ALFRED_VIS is not set
+CONFIG_PACKAGE_ath10k-firmware-qca9887-ct=m
 CONFIG_PACKAGE_ath10k-firmware-qca988x-ct=m
 CONFIG_PACKAGE_kmod-ath10k-ct=m
 CONFIG_PACKAGE_kmod-hwmon-core=m
diff --git a/bsp/board_ar71xx.bsp b/bsp/board_ar71xx.bsp
index 6c541cc..1137b0d 100644
--- a/bsp/board_ar71xx.bsp
+++ b/bsp/board_ar71xx.bsp
@@ -31,4 +31,5 @@  images=("lede-ar71xx-generic-cpe210-220-squashfs-sysupgrade.bin"
         "lede-ar71xx-generic-tl-wdr4300-v1-squashfs-sysupgrade.bin"
         "lede-ar71xx-generic-tl-wdr4310-v1-squashfs-sysupgrade.bin"
         "lede-ar71xx-generic-archer-c7-v2-squashfs-sysupgrade.bin"
+        "lede-ar71xx-generic-archer-c25-v1-squashfs-sysupgrade.bin"
         )
diff --git a/build_patches/openwrt/0005-firmware-utils-tplink-safeloader-support-strings-as-.patch b/build_patches/openwrt/0005-firmware-utils-tplink-safeloader-support-strings-as-.patch
new file mode 100644
index 0000000..289322e
--- /dev/null
+++ b/build_patches/openwrt/0005-firmware-utils-tplink-safeloader-support-strings-as-.patch
@@ -0,0 +1,162 @@ 
+From e9ef329106fbf7e71718e73aee8b48315dd22a18 Mon Sep 17 00:00:00 2001
+From: Jan Niehusmann <jan@gondor.com>
+Date: Fri, 19 May 2017 09:42:24 +0200
+Subject: [PATCH 5/7] firmware-utils: tplink-safeloader: support strings as
+ soft_version
+
+Some TP-Link routers (C25, C59, C60) contain a version string instead
+of a binary structure in the soft_version partition.
+
+Flashing LEDE from the original firmware's GUI, this version string
+taken from the soft_ver partition of the firmware image is written to
+the router's config partition.
+
+When using tftp recovery to go back to the original Archer C25 firmware,
+a version check compares that version to the version of the firmware to
+be flashed.
+
+Without proper contents in the config partition, reverting to the
+original firmware fails.
+
+Therefore, write the string "soft_ver:1.0.0\n" to that soft_ver
+partition.
+
+Signed-off-by: Jan Niehusmann <jan@gondor.com>
+[Rebased on v17.01.2]
+Signed-off-by: Tim Niemeyer <tim@tnx-x.org>
+---
+ tools/firmware-utils/src/tplink-safeloader.c | 34 +++++++++++++++++++++++++++-
+ 1 file changed, 33 insertions(+), 1 deletion(-)
+
+diff --git a/tools/firmware-utils/src/tplink-safeloader.c b/tools/firmware-utils/src/tplink-safeloader.c
+index 4e3d205..688cdac 100644
+--- a/tools/firmware-utils/src/tplink-safeloader.c
++++ b/tools/firmware-utils/src/tplink-safeloader.c
+@@ -75,6 +75,7 @@ struct device_info {
+ 	const char *vendor;
+ 	const char *support_list;
+ 	char support_trail;
++	const char *soft_ver;
+ 	const struct flash_partition_entry partitions[MAX_PARTITIONS+1];
+ 	const char *first_sysupgrade_partition;
+ 	const char *last_sysupgrade_partition;
+@@ -130,6 +131,7 @@ static struct device_info boards[] = {
+ 			"CPE220(TP-LINK|US|N300-2):1.1\r\n"
+ 			"CPE220(TP-LINK|EU|N300-2):1.1\r\n",
+ 		.support_trail = '\xff',
++		.soft_ver = NULL,
+ 
+ 		.partitions = {
+ 			{"fs-uboot", 0x00000, 0x20000},
+@@ -167,6 +169,7 @@ static struct device_info boards[] = {
+ 			"CPE520(TP-LINK|US|N300-5):1.1\r\n"
+ 			"CPE520(TP-LINK|EU|N300-5):1.1\r\n",
+ 		.support_trail = '\xff',
++		.soft_ver = NULL,
+ 
+ 		.partitions = {
+ 			{"fs-uboot", 0x00000, 0x20000},
+@@ -198,6 +201,7 @@ static struct device_info boards[] = {
+ 			"WBS210(TP-LINK|US|N300-2):1.20\r\n"
+ 			"WBS210(TP-LINK|EU|N300-2):1.20\r\n",
+ 		.support_trail = '\xff',
++		.soft_ver = NULL,
+ 
+ 		.partitions = {
+ 			{"fs-uboot", 0x00000, 0x20000},
+@@ -229,6 +233,7 @@ static struct device_info boards[] = {
+ 			"WBS510(TP-LINK|US|N300-5):1.20\r\n"
+ 			"WBS510(TP-LINK|EU|N300-5):1.20\r\n",
+ 		.support_trail = '\xff',
++		.soft_ver = NULL,
+ 
+ 		.partitions = {
+ 			{"fs-uboot", 0x00000, 0x20000},
+@@ -259,6 +264,7 @@ static struct device_info boards[] = {
+ 			"SupportList:\r\n"
+ 			"{product_name:Archer C2600,product_ver:1.0.0,special_id:00000000}\r\n",
+ 		.support_trail = '\x00',
++		.soft_ver = NULL,
+ 
+ 		.partitions = {
+ 			{"SBL1", 0x00000, 0x20000},
+@@ -303,6 +309,7 @@ static struct device_info boards[] = {
+ 			"product_ver:2.0.0,"
+ 			"special_id:00000000}\r\n",
+ 		.support_trail = '\x00',
++		.soft_ver = NULL,
+ 
+ 		.partitions = {
+ 			{"fs-uboot", 0x00000, 0x40000},
+@@ -337,6 +344,7 @@ static struct device_info boards[] = {
+ 			"product_ver:1.0.0,"
+ 			"special_id:00000000}\n",
+ 		.support_trail = '\x00',
++		.soft_ver = NULL,
+ 
+ 		.partitions = {
+ 			{"fs-uboot", 0x00000, 0x40000},
+@@ -369,6 +377,7 @@ static struct device_info boards[] = {
+ 			"SupportList:\r\n"
+ 			"EAP120(TP-LINK|UN|N300-2):1.0\r\n",
+ 		.support_trail = '\xff',
++		.soft_ver = NULL,
+ 
+ 		.partitions = {
+ 			{"fs-uboot", 0x00000, 0x20000},
+@@ -398,6 +407,7 @@ static struct device_info boards[] = {
+ 			"SupportList:\n"
+ 			"{product_name:TL-WR1043ND,product_ver:4.0.0,special_id:45550000}\n",
+ 		.support_trail = '\x00',
++		.soft_ver = NULL,
+ 
+ 		/**
+ 		    We use a bigger os-image partition than the stock images (and thus
+@@ -441,6 +451,7 @@ static struct device_info boards[] = {
+ 			"{product_name:RE450,product_ver:1.0.0,special_id:4B520000}\r\n"
+ 			"{product_name:RE450,product_ver:1.0.0,special_id:55534100}\r\n",
+ 		.support_trail = '\x00',
++		.soft_ver = NULL,
+ 
+ 		/**
+ 		   The flash partition table for RE450;
+@@ -569,6 +580,23 @@ static struct image_partition_entry make_soft_version(uint32_t rev) {
+ 	return entry;
+ }
+ 
++static struct image_partition_entry make_soft_version_from_string(const char *soft_ver) {
++	/** String length _including_ the terminating zero byte */
++	uint32_t ver_len = strlen(soft_ver) + 1;
++	/** Partition contains 64 bit header, the version string, and one additional null byte */
++	size_t partition_len = 2*sizeof(uint32_t) + ver_len + 1;
++	struct image_partition_entry entry = alloc_image_partition("soft-version", partition_len);
++
++	uint32_t *len = (uint32_t *)entry.data;
++	len[0] = htonl(ver_len);
++	len[1] = 0;
++	memcpy(&len[2], soft_ver, ver_len);
++
++	entry.data[partition_len - 1] = 0;
++
++	return entry;
++}
++
+ /** Generates the support-list partition */
+ static struct image_partition_entry make_support_list(const struct device_info *info) {
+ 	size_t len = strlen(info->support_list);
+@@ -799,7 +827,11 @@ static void build_image(const char *output,
+ 	struct image_partition_entry parts[6] = {};
+ 
+ 	parts[0] = make_partition_table(info->partitions);
+-	parts[1] = make_soft_version(rev);
++	if (info->soft_ver)
++		parts[1] = make_soft_version_from_string(info->soft_ver);
++	else
++		parts[1] = make_soft_version(rev);
++
+ 	parts[2] = make_support_list(info);
+ 	parts[3] = read_file("os-image", kernel_image, false);
+ 	parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof);
+-- 
+2.1.4
+
diff --git a/build_patches/openwrt/0006-ar71xx-add-support-for-TP-Link-Archer-C25-v1.patch b/build_patches/openwrt/0006-ar71xx-add-support-for-TP-Link-Archer-C25-v1.patch
new file mode 100644
index 0000000..aa0f9ce
--- /dev/null
+++ b/build_patches/openwrt/0006-ar71xx-add-support-for-TP-Link-Archer-C25-v1.patch
@@ -0,0 +1,499 @@ 
+From a5290bd7279f0aa4a7129ce103fec154239ddd86 Mon Sep 17 00:00:00 2001
+From: Ludwig Thomeczek <ledesrc@wxorx.net>
+Date: Sat, 22 Apr 2017 18:21:47 +0200
+Subject: [PATCH 6/7] ar71xx: add support for TP-Link Archer C25 v1
+
+The TP-Link Archer C25 is a low-cost dual-band router.
+
+Specification:
+
+- CPU: Atheros QCA9561 775 MHz
+- RAM: 64 MB
+- Flash: 8 MB
+- Wifi: 3x3 2.4 GHz (integrated), 1x1 5 GHz QCA9887
+- NET: 5x 10/100 Mbps Ethernet
+
+Some LEDs are controlled by an additional 74HC595 chip.
+
+Signed-off-by: Ludwig Thomeczek <ledesrc@wxorx.net>
+[minor code style fixes, boards alphabetical order fixes,
+reworked commit message]
+Signed-off-by: Piotr Dymacz <pepe2k@gmail.com>
+[Rebased on v17.01.2]
+Signed-off-by: Tim Niemeyer <tim@tnx-x.org>
+---
+ target/linux/ar71xx/base-files/etc/board.d/01_leds |   9 +
+ .../linux/ar71xx/base-files/etc/board.d/02_network |   1 +
+ target/linux/ar71xx/base-files/etc/diag.sh         |   1 +
+ .../etc/hotplug.d/firmware/11-ath10k-caldata       |   1 +
+ target/linux/ar71xx/base-files/lib/ar71xx.sh       |   3 +
+ .../ar71xx/base-files/lib/upgrade/platform.sh      |   1 +
+ target/linux/ar71xx/config-4.4                     |   3 +
+ .../ar71xx/files/arch/mips/ath79/Kconfig.openwrt   |  11 +
+ target/linux/ar71xx/files/arch/mips/ath79/Makefile |   1 +
+ .../files/arch/mips/ath79/mach-archer-c25-v1.c     | 227 +++++++++++++++++++++
+ .../linux/ar71xx/files/arch/mips/ath79/machtypes.h |   1 +
+ target/linux/ar71xx/image/tp-link.mk               |  24 +++
+ target/linux/ar71xx/mikrotik/config-default        |   1 +
+ target/linux/ar71xx/nand/config-default            |   1 +
+ 14 files changed, 285 insertions(+)
+ create mode 100644 target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c
+
+diff --git a/target/linux/ar71xx/base-files/etc/board.d/01_leds b/target/linux/ar71xx/base-files/etc/board.d/01_leds
+index 0279dfc..3aa2bfb 100755
+--- a/target/linux/ar71xx/base-files/etc/board.d/01_leds
++++ b/target/linux/ar71xx/base-files/etc/board.d/01_leds
+@@ -49,6 +49,15 @@ antrouter-r1)
+ 	ucidef_set_led_wlan "wlan" "WLAN" "$board:green:wlan" "phy0tpt"
+ 	ucidef_set_led_default "btc" "BTC" "$board:green:btc" "0"
+ 	;;
++archer-c25-v1)
++	ucidef_set_led_netdev "wan" "WAN" "$board:green:wan" "eth0"
++	ucidef_set_led_wlan "wlan" "WLAN" "$board:green:wlan2g" "phy1tpt"
++	ucidef_set_led_wlan "wlan5g" "WLAN5G" "$board:green:wlan5g" "phy0tpt"
++	ucidef_set_led_switch "lan1" "LAN1" "$board:green:lan1" "switch0" "0x10"
++	ucidef_set_led_switch "lan2" "LAN2" "$board:green:lan2" "switch0" "0x08"
++	ucidef_set_led_switch "lan3" "LAN3" "$board:green:lan3" "switch0" "0x04"
++	ucidef_set_led_switch "lan4" "LAN4" "$board:green:lan4" "switch0" "0x02"
++	;;
+ arduino-yun)
+ 	ucidef_set_led_wlan "wlan" "WLAN" "arduino:blue:wlan" "phy0tpt"
+ 	ucidef_set_led_usbdev "usb" "USB" "arduino:white:usb" "1-1.1"
+diff --git a/target/linux/ar71xx/base-files/etc/board.d/02_network b/target/linux/ar71xx/base-files/etc/board.d/02_network
+index c8c7827..4404e80 100755
+--- a/target/linux/ar71xx/base-files/etc/board.d/02_network
++++ b/target/linux/ar71xx/base-files/etc/board.d/02_network
+@@ -122,6 +122,7 @@ ar71xx_setup_interfaces()
+ 	a60|\
+ 	alfa-ap96|\
+ 	alfa-nx|\
++	archer-c25-v1|\
+ 	dr344|\
+ 	gl-ar150|\
+ 	gl-ar300m|\
+diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh
+index 7b8aac8..cf6278c 100644
+--- a/target/linux/ar71xx/base-files/etc/diag.sh
++++ b/target/linux/ar71xx/base-files/etc/diag.sh
+@@ -47,6 +47,7 @@ get_status_led() {
+ 	ap135-020)
+ 		status_led="ap135:green:status"
+ 		;;
++	archer-c25-v1|\
+ 	mr12|\
+ 	mr16|\
+ 	nbg6616|\
+diff --git a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
+index b3e23c9..68f90de 100644
+--- a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
++++ b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
+@@ -92,6 +92,7 @@ case "$FIRMWARE" in
+ 		ath10kcal_extract "art" 20480 2116
+ 		ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) -2)
+ 		;;
++	archer-c25-v1|\
+ 	tl-wdr6500-v2)
+ 		ath10kcal_extract "art" 20480 2116
+ 		ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth1/address) -2)
+diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh
+index b035535..0d01c5e 100755
+--- a/target/linux/ar71xx/base-files/lib/ar71xx.sh
++++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh
+@@ -457,6 +457,9 @@ ar71xx_board_detect() {
+ 	*AP90Q)
+ 		name="ap90q"
+ 		;;
++	*"Archer C25 v1")
++		name="archer-c25-v1"
++		;;
+ 	*"Archer C5")
+ 		name="archer-c5"
+ 		;;
+diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
+index 580e09a..e2aaceb 100755
+--- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
++++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
+@@ -205,6 +205,7 @@ platform_check_image() {
+ 	airrouter|\
+ 	ap132|\
+ 	ap90q|\
++	archer-c25-v1|\
+ 	bullet-m|\
+ 	c-55|\
+ 	carambola2|\
+diff --git a/target/linux/ar71xx/config-4.4 b/target/linux/ar71xx/config-4.4
+index ff6bb13..79308e8 100644
+--- a/target/linux/ar71xx/config-4.4
++++ b/target/linux/ar71xx/config-4.4
+@@ -50,6 +50,7 @@ CONFIG_ATH79_MACH_AP152=y
+ # CONFIG_ATH79_MACH_AP81 is not set
+ CONFIG_ATH79_MACH_AP90Q=y
+ CONFIG_ATH79_MACH_AP96=y
++CONFIG_ATH79_MACH_ARCHER_C25_V1=y
+ CONFIG_ATH79_MACH_ARCHER_C7=y
+ CONFIG_ATH79_MACH_ARDUINO_YUN=y
+ CONFIG_ATH79_MACH_AW_NR580=y
+@@ -269,6 +270,7 @@ CONFIG_GENERIC_SMP_IDLE_THREAD=y
+ CONFIG_GENERIC_TIME_VSYSCALL=y
+ CONFIG_GPIOLIB=y
+ CONFIG_GPIOLIB_IRQCHIP=y
++CONFIG_GPIO_74X164=y
+ CONFIG_GPIO_DEVRES=y
+ # CONFIG_GPIO_LATCH is not set
+ CONFIG_GPIO_NXP_74HC153=y
+@@ -335,6 +337,7 @@ CONFIG_LEDS_NU801=y
+ CONFIG_LIBFDT=y
+ CONFIG_MARVELL_PHY=y
+ CONFIG_MDIO_BITBANG=y
++CONFIG_SPI_GPIO=y
+ CONFIG_MDIO_BOARDINFO=y
+ CONFIG_MDIO_GPIO=y
+ CONFIG_MICREL_PHY=y
+diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
+index 76ba6fa..d49659c 100644
+--- a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
++++ b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
+@@ -1224,6 +1224,17 @@ config ATH79_MACH_BSB
+ 	select ATH79_DEV_USB
+ 	select ATH79_DEV_WMAC
+ 
++config ATH79_MACH_ARCHER_C25_V1
++	bool "TP-LINK Archer C25 v1 support"
++	select SOC_QCA956X
++	select ATH79_DEV_AP9X_PCI if PCI
++	select ATH79_DEV_ETH
++	select ATH79_DEV_GPIO_BUTTONS
++	select ATH79_DEV_LEDS_GPIO
++	select ATH79_DEV_M25P80
++	select ATH79_DEV_WMAC
++
++
+ config ATH79_MACH_ARCHER_C7
+ 	bool "TP-LINK Archer C5/C7/TL-WDR4900 v2 board support"
+ 	select SOC_QCA955X
+diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Makefile b/target/linux/ar71xx/files/arch/mips/ath79/Makefile
+index c91d03f..fc28716 100644
+--- a/target/linux/ar71xx/files/arch/mips/ath79/Makefile
++++ b/target/linux/ar71xx/files/arch/mips/ath79/Makefile
+@@ -55,6 +55,7 @@ obj-$(CONFIG_ATH79_MACH_AP147)			+= mach-ap147.o
+ obj-$(CONFIG_ATH79_MACH_AP152)			+= mach-ap152.o
+ obj-$(CONFIG_ATH79_MACH_AP90Q)			+= mach-ap90q.o
+ obj-$(CONFIG_ATH79_MACH_AP96)			+= mach-ap96.o
++obj-$(CONFIG_ATH79_MACH_ARCHER_C25_V1)		+= mach-archer-c25-v1.o
+ obj-$(CONFIG_ATH79_MACH_ARCHER_C7)		+= mach-archer-c7.o
+ obj-$(CONFIG_ATH79_MACH_ARDUINO_YUN)		+= mach-arduino-yun.o
+ obj-$(CONFIG_ATH79_MACH_AW_NR580)		+= mach-aw-nr580.o
+diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c
+new file mode 100644
+index 0000000..a0f001c
+--- /dev/null
++++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c
+@@ -0,0 +1,227 @@
++/*
++ *  TP-Link Archer C25 v1 board support
++ *
++ *  Copyright (C) 2017 Ludwig Thomeczek <ledesrc@wxorx.net>
++ *  based on mach-archer-c60/C59-v1.c
++ *  Copyright (C) 2016 Henryk Heisig <hyniu@o2.pl>
++ *
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ */
++#include <linux/platform_device.h>
++#include <linux/ath9k_platform.h>
++#include <linux/ar8216_platform.h>
++#include <asm/mach-ath79/ar71xx_regs.h>
++#include <linux/gpio.h>
++
++#include "common.h"
++#include "dev-m25p80.h"
++#include "machtypes.h"
++#include "pci.h"
++#include "dev-ap9x-pci.h"
++#include "dev-eth.h"
++#include "dev-gpio-buttons.h"
++#include "dev-leds-gpio.h"
++#include "dev-spi.h"
++#include "dev-usb.h"
++#include "dev-wmac.h"
++#include <linux/spi/spi_gpio.h>
++#include <linux/spi/74x164.h>
++
++#define ARCHER_C25_GPIO_SHIFT_OE	21 /* OE,   Output Enable */
++#define ARCHER_C25_GPIO_SHIFT_SER	14 /* DS,   Data Serial Input */
++#define ARCHER_C25_GPIO_SHIFT_SRCLK	15 /* SHCP, Shift Reg Clock Input */
++#define ARCHER_C25_GPIO_SHIFT_SRCLR	19 /* MR,   Master Reset */
++#define ARCHER_C25_GPIO_SHIFT_RCLK	16 /* STCP, Storage Reg Clock Input */
++
++#define ARCHER_C25_74HC_GPIO_BASE		QCA956X_GPIO_COUNT
++#define ARCHER_C25_74HC_GPIO_LED_WAN_AMBER	27
++#define ARCHER_C25_74HC_GPIO_LED_WAN_GREEN	28
++#define ARCHER_C25_74HC_GPIO_LED_WLAN2		29
++#define ARCHER_C25_74HC_GPIO_LED_WLAN5		30
++#define ARCHER_C25_74HC_GPIO_LED_LAN1		23
++#define ARCHER_C25_74HC_GPIO_LED_LAN2		24
++#define ARCHER_C25_74HC_GPIO_LED_LAN3		25
++#define ARCHER_C25_74HC_GPIO_LED_LAN4		26
++
++#define ARCHER_C25_V1_SSR_BIT_0			0
++#define ARCHER_C25_V1_SSR_BIT_1			1
++#define ARCHER_C25_V1_SSR_BIT_2			2
++#define ARCHER_C25_V1_SSR_BIT_3			3
++#define ARCHER_C25_V1_SSR_BIT_4			4
++#define ARCHER_C25_V1_SSR_BIT_5			5
++#define ARCHER_C25_V1_SSR_BIT_6			6
++#define ARCHER_C25_V1_SSR_BIT_7			7
++
++
++#define ARCHER_C25_V1_KEYS_POLL_INTERVAL	20
++#define ARCHER_C25_V1_KEYS_DEBOUNCE_INTERVAL	\
++					(3 * ARCHER_C25_V1_KEYS_POLL_INTERVAL)
++
++#define ARCHER_C25_V1_GPIO_BTN_RESET		1
++#define ARCHER_C25_V1_GPIO_BTN_RFKILL		22
++
++#define ARCHER_C25_V1_GPIO_LED_POWER		17
++#define ARCHER_C25_V1_GPIO_LED_WPS		2
++
++#define ARCHER_C25_V1_WMAC_CALDATA_OFFSET	0x1000
++
++static struct spi_gpio_platform_data archer_c25_v1_spi_data = {
++	.sck		= ARCHER_C25_GPIO_SHIFT_SRCLK,
++	.miso		= SPI_GPIO_NO_MISO,
++	.mosi		= ARCHER_C25_GPIO_SHIFT_SER,
++	.num_chipselect	= 1,
++};
++
++static u8 archer_c25_v1_ssr_initdata[] __initdata = {
++	BIT(ARCHER_C25_V1_SSR_BIT_7) |
++	BIT(ARCHER_C25_V1_SSR_BIT_6) |
++	BIT(ARCHER_C25_V1_SSR_BIT_5) |
++	BIT(ARCHER_C25_V1_SSR_BIT_4) |
++	BIT(ARCHER_C25_V1_SSR_BIT_3) |
++	BIT(ARCHER_C25_V1_SSR_BIT_2) |
++	BIT(ARCHER_C25_V1_SSR_BIT_1)
++};
++
++static struct gen_74x164_chip_platform_data archer_c25_v1_ssr_data = {
++	.base = ARCHER_C25_74HC_GPIO_BASE,
++	.num_registers = ARRAY_SIZE(archer_c25_v1_ssr_initdata),
++	.init_data = archer_c25_v1_ssr_initdata,
++};
++
++static struct platform_device archer_c25_v1_spi_device = {
++	.name		= "spi_gpio",
++	.id		= 1,
++	.dev = {
++		.platform_data = &archer_c25_v1_spi_data,
++	},
++};
++
++static struct spi_board_info archer_c25_v1_spi_info[] = {
++	{
++		.bus_num		= 1,
++		.chip_select		= 0,
++		.max_speed_hz		= 10000000,
++		.modalias		= "74x164",
++		.platform_data		= &archer_c25_v1_ssr_data,
++		.controller_data	= (void *) ARCHER_C25_GPIO_SHIFT_RCLK,
++	},
++};
++
++static struct gpio_led archer_c25_v1_leds_gpio[] __initdata = {
++	{
++		.name		= "archer-c25-v1:green:power",
++		.gpio		= ARCHER_C25_V1_GPIO_LED_POWER,
++		.active_low	= 1,
++	}, {
++		.name		= "archer-c25-v1:green:wps",
++		.gpio		= ARCHER_C25_V1_GPIO_LED_WPS,
++		.active_low	= 1,
++	}, {
++		.name		= "archer-c25-v1:green:wlan2g",
++		.gpio		= ARCHER_C25_74HC_GPIO_LED_WLAN2,
++		.active_low	= 1,
++	}, {
++		.name		= "archer-c25-v1:green:wlan5g",
++		.gpio		= ARCHER_C25_74HC_GPIO_LED_WLAN5,
++		.active_low	= 1,
++	}, {
++		.name		= "archer-c25-v1:green:lan1",
++		.gpio		= ARCHER_C25_74HC_GPIO_LED_LAN1,
++		.active_low	= 1,
++	}, {
++		.name		= "archer-c25-v1:green:lan2",
++		.gpio		= ARCHER_C25_74HC_GPIO_LED_LAN2,
++		.active_low	= 1,
++	}, {
++		.name		= "archer-c25-v1:green:lan3",
++		.gpio		= ARCHER_C25_74HC_GPIO_LED_LAN3,
++		.active_low	= 1,
++	}, {
++		.name		= "archer-c25-v1:green:lan4",
++		.gpio		= ARCHER_C25_74HC_GPIO_LED_LAN4,
++		.active_low	= 1,
++	}, {
++		.name		= "archer-c25-v1:green:wan",
++		.gpio		=  ARCHER_C25_74HC_GPIO_LED_WAN_GREEN,
++		.active_low	= 1,
++	}, {
++		.name		= "archer-c25-v1:amber:wan",
++		.gpio		=  ARCHER_C25_74HC_GPIO_LED_WAN_AMBER,
++		.active_low	= 1,
++	},
++};
++
++static struct gpio_keys_button archer_c25_v1_gpio_keys[] __initdata = {
++	{
++		.desc			= "Reset button",
++		.type			= EV_KEY,
++		.code			= KEY_RESTART,
++		.debounce_interval	= ARCHER_C25_V1_KEYS_DEBOUNCE_INTERVAL,
++		.gpio			= ARCHER_C25_V1_GPIO_BTN_RESET,
++		.active_low		= 1,
++	}, {
++		.desc			= "RFKILL button",
++		.type			= EV_KEY,
++		.code			= KEY_RFKILL,
++		.debounce_interval	= ARCHER_C25_V1_KEYS_DEBOUNCE_INTERVAL,
++		.gpio			= ARCHER_C25_V1_GPIO_BTN_RFKILL,
++		.active_low		= 1,
++	},
++};
++
++static void __init archer_c25_v1_setup(void)
++{
++	u8 *mac = (u8 *) KSEG1ADDR(0x1f7e0008);
++	u8 *art = (u8 *) KSEG1ADDR(0x1f7f0000);
++
++	ath79_register_m25p80(NULL);
++
++	spi_register_board_info(archer_c25_v1_spi_info,
++				ARRAY_SIZE(archer_c25_v1_spi_info));
++
++	platform_device_register(&archer_c25_v1_spi_device);
++
++	gpio_request_one(ARCHER_C25_GPIO_SHIFT_OE,
++			 GPIOF_OUT_INIT_LOW | GPIOF_EXPORT_DIR_FIXED,
++			 "LED control");
++
++	gpio_request_one(ARCHER_C25_GPIO_SHIFT_SRCLR,
++			 GPIOF_OUT_INIT_HIGH | GPIOF_EXPORT_DIR_FIXED,
++			 "LED reset");
++
++	ath79_register_leds_gpio(-1, ARRAY_SIZE(archer_c25_v1_leds_gpio),
++				 archer_c25_v1_leds_gpio);
++
++	ath79_register_gpio_keys_polled(-1, ARCHER_C25_V1_KEYS_POLL_INTERVAL,
++					ARRAY_SIZE(archer_c25_v1_gpio_keys),
++					archer_c25_v1_gpio_keys);
++
++	ath79_register_mdio(0, 0x0);
++	ath79_register_mdio(1, 0x0);
++
++	ath79_init_mac(ath79_eth0_data.mac_addr, mac, 0);
++	ath79_init_mac(ath79_eth1_data.mac_addr, mac, 1);
++
++	/* WAN port */
++	ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
++	ath79_eth0_data.speed = SPEED_100;
++	ath79_eth0_data.duplex = DUPLEX_FULL;
++	ath79_eth0_data.phy_mask = BIT(4);
++	ath79_register_eth(0);
++
++	/* LAN ports */
++	ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII;
++	ath79_eth1_data.speed = SPEED_1000;
++	ath79_eth1_data.duplex = DUPLEX_FULL;
++	ath79_switch_data.phy_poll_mask |= BIT(4);
++	ath79_switch_data.phy4_mii_en = 1;
++	ath79_register_eth(1);
++
++	ath79_register_wmac(art + ARCHER_C25_V1_WMAC_CALDATA_OFFSET, mac);
++	ap91_pci_init(NULL, NULL);
++}
++
++MIPS_MACHINE(ATH79_MACH_ARCHER_C25_V1, "ARCHER-C25-V1", "TP-LINK Archer C25 v1",
++	     archer_c25_v1_setup);
+diff --git a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
+index b9a8e3e..53f0d1c 100644
+--- a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
++++ b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
+@@ -39,6 +39,7 @@ enum ath79_mach_type {
+ 	ATH79_MACH_AP152,			/* Atheros AP152 reference board */
+ 	ATH79_MACH_AP90Q,			/* YunCore AP90Q */
+ 	ATH79_MACH_AP96,			/* Atheros AP96 */
++	ATH79_MACH_ARCHER_C25_V1,		/* TP-LINK Archer C25 V1 board */
+ 	ATH79_MACH_ARCHER_C5,			/* TP-LINK Archer C5 board */
+ 	ATH79_MACH_ARCHER_C7,			/* TP-LINK Archer C7 board */
+ 	ATH79_MACH_ARCHER_C7_V2,		/* TP-LINK Archer C7 V2 board */
+diff --git a/target/linux/ar71xx/image/tp-link.mk b/target/linux/ar71xx/image/tp-link.mk
+index 1c88f43..f70c12c 100644
+--- a/target/linux/ar71xx/image/tp-link.mk
++++ b/target/linux/ar71xx/image/tp-link.mk
+@@ -45,6 +45,14 @@ define Build/mktplinkfw-kernel
+ 	@mv $@.new $@
+ endef
+ 
++define Build/uImageArcher
++	mkimage -A $(LINUX_KARCH) \
++			-O linux -T kernel \
++			-C $(1) -a $(KERNEL_LOADADDR) -e $(if $(KERNEL_ENTRY),$(KERNEL_ENTRY),$(KERNEL_LOADADDR)) \
++			-n '$(call toupper,$(LINUX_KARCH)) LEDE Linux-$(LINUX_VERSION)' -d $@ $@.new
++	@mv $@.new $@
++endef
++
+ define Device/tplink
+   TPLINK_HWREV := 0x1
+   TPLINK_HEADER_VERSION := 1
+@@ -95,6 +103,22 @@ $(Device/tplink)
+   IMAGE_SIZE := 15872k
+ endef
+ 
++define Device/archer-c25-v1
++  DEVICE_TITLE := TP-LINK Archer C25 v1
++  DEVICE_PACKAGES := kmod-ath10k ath10k-firmware-qca9887
++  BOARDNAME := ARCHER-C25-V1
++  TPLINK_BOARD_NAME := ARCHER-C25-V1
++  DEVICE_PROFILE := ARCHERC25V1
++  IMAGE_SIZE := 7808k
++  LOADER_TYPE := elf
++  KERNEL := kernel-bin | patch-cmdline | lzma | uImageArcher lzma
++  IMAGES := sysupgrade.bin factory.bin
++  IMAGE/sysupgrade.bin := append-rootfs | tplink-safeloader sysupgrade
++  IMAGE/factory.bin := append-rootfs | tplink-safeloader factory
++  MTDPARTS := spi0.0:128k(factory-uboot)ro,64k(u-boot)ro,1536k(kernel),6272k(rootfs),128k(config)ro,64k(art)ro,7808k@0x30000(firmware)
++endef
++TARGET_DEVICES += archer-c25-v1
++
+ define Device/cpe510-520
+   DEVICE_TITLE := TP-LINK CPE510/520
+   DEVICE_PACKAGES := rssileds
+diff --git a/target/linux/ar71xx/mikrotik/config-default b/target/linux/ar71xx/mikrotik/config-default
+index 44ea327..3f11c23 100644
+--- a/target/linux/ar71xx/mikrotik/config-default
++++ b/target/linux/ar71xx/mikrotik/config-default
+@@ -15,6 +15,7 @@
+ # CONFIG_ATH79_MACH_AP152 is not set
+ # CONFIG_ATH79_MACH_AP90Q is not set
+ # CONFIG_ATH79_MACH_AP96 is not set
++# CONFIG_ATH79_MACH_ARCHER_C25_V1 is not set
+ # CONFIG_ATH79_MACH_ARCHER_C7 is not set
+ # CONFIG_ATH79_MACH_ARDUINO_YUN is not set
+ # CONFIG_ATH79_MACH_AW_NR580 is not set
+diff --git a/target/linux/ar71xx/nand/config-default b/target/linux/ar71xx/nand/config-default
+index 515266b..6357531 100644
+--- a/target/linux/ar71xx/nand/config-default
++++ b/target/linux/ar71xx/nand/config-default
+@@ -8,6 +8,7 @@
+ # CONFIG_ATH79_MACH_AP136 is not set
+ # CONFIG_ATH79_MACH_AP147 is not set
+ # CONFIG_ATH79_MACH_AP96 is not set
++# CONFIG_ATH79_MACH_ARCHER_C25_V1 is not set
+ # CONFIG_ATH79_MACH_ARCHER_C7 is not set
+ # CONFIG_ATH79_MACH_AW_NR580 is not set
+ # CONFIG_ATH79_MACH_CAP324 is not set
+-- 
+2.1.4
+
diff --git a/build_patches/openwrt/0007-firmware-utils-tplink-safeloader-add-TP-Link-Archer-.patch b/build_patches/openwrt/0007-firmware-utils-tplink-safeloader-add-TP-Link-Archer-.patch
new file mode 100644
index 0000000..861ccfd
--- /dev/null
+++ b/build_patches/openwrt/0007-firmware-utils-tplink-safeloader-add-TP-Link-Archer-.patch
@@ -0,0 +1,112 @@ 
+From ae91fb7f8cef0fbd9b0ee707ce577ac9c5cdf2f2 Mon Sep 17 00:00:00 2001
+From: Ludwig Thomeczek <ledesrc@wxorx.net>
+Date: Sat, 13 May 2017 11:40:48 +0200
+Subject: [PATCH 7/7] firmware-utils: tplink-safeloader: add TP-Link Archer C25
+ v1
+
+This adds the necessary firmware layout definitions for the Archer C25.
+It has an addtional partition containing some static data ("extra-para")
+without which no factory flash is possible, therefore put_data() has been
+added.
+
+Signed-off-by: Ludwig Thomeczek <ledesrc@wxorx.net>
+[Rebased on v17.01.2]
+Signed-off-by: Tim Niemeyer <tim@tnx-x.org>
+---
+ tools/firmware-utils/src/tplink-safeloader.c | 59 +++++++++++++++++++++++++++-
+ 1 file changed, 58 insertions(+), 1 deletion(-)
+
+diff --git a/tools/firmware-utils/src/tplink-safeloader.c b/tools/firmware-utils/src/tplink-safeloader.c
+index 688cdac..2468426 100644
+--- a/tools/firmware-utils/src/tplink-safeloader.c
++++ b/tools/firmware-utils/src/tplink-safeloader.c
+@@ -299,6 +299,48 @@ static struct device_info boards[] = {
+ 		.last_sysupgrade_partition = "file-system"
+ 	},
+ 
++	/** Firmware layout for the C25v1 */
++	{
++		.id = "ARCHER-C25-V1",
++		.support_list =
++			"SupportList:\n"
++			"{product_name:ArcherC25,product_ver:1.0.0,special_id:00000000}\n"
++			"{product_name:ArcherC25,product_ver:1.0.0,special_id:55530000}\n"
++			"{product_name:ArcherC25,product_ver:1.0.0,special_id:45550000}\n",
++		.support_trail = '\x00',
++		.soft_ver = "soft_ver:1.0.0\n",
++
++		/**
++		    We use a bigger os-image partition than the stock images (and thus
++		    smaller file-system), as our kernel doesn't fit in the stock firmware's
++		    1MB os-image.
++		*/
++		.partitions = {
++			{"factory-boot", 0x00000, 0x20000},
++			{"fs-uboot", 0x20000, 0x10000},
++			{"os-image", 0x30000, 0x180000},	/* Stock: base 0x30000 size 0x100000 */
++			{"file-system", 0x1b0000, 0x620000},	/* Stock: base 0x130000 size 0x6a0000 */
++			{"user-config", 0x7d0000, 0x04000},
++			{"default-mac", 0x7e0000, 0x00100},
++			{"device-id", 0x7e0100, 0x00100},
++			{"extra-para", 0x7e0200, 0x00100},
++			{"pin", 0x7e0300, 0x00100},
++			{"support-list", 0x7e0400, 0x00400},
++			{"soft-version", 0x7e0800, 0x00400},
++			{"product-info", 0x7e0c00, 0x01400},
++			{"partition-table", 0x7e2000, 0x01000},
++			{"profile", 0x7e3000, 0x01000},
++			{"default-config", 0x7e4000, 0x04000},
++			{"merge-config", 0x7ec000, 0x02000},
++			{"qos-db", 0x7ee000, 0x02000},
++			{"radio", 0x7f0000, 0x10000},
++			{NULL, 0, 0}
++		},
++
++		.first_sysupgrade_partition = "os-image",
++		.last_sysupgrade_partition = "file-system",
++	},
++
+ 	/** Firmware layout for the C5 */
+ 	{
+ 		.id = "ARCHER-C5-V2",
+@@ -643,6 +685,15 @@ static struct image_partition_entry read_file(const char *part_name, const char
+ 	return entry;
+ }
+ 
++/** Creates a new image partition from arbitrary data */
++static struct image_partition_entry put_data(const char *part_name, const char *datain, size_t len) {
++
++	struct image_partition_entry entry = alloc_image_partition(part_name, len);
++
++	memcpy(entry.data, datain, len);
++
++	return entry;
++}
+ 
+ /**
+    Copies a list of image partitions into an image buffer and generates the image partition table while doing so
+@@ -824,7 +875,8 @@ static void build_image(const char *output,
+ 		bool add_jffs2_eof,
+ 		bool sysupgrade,
+ 		const struct device_info *info) {
+-	struct image_partition_entry parts[6] = {};
++
++	struct image_partition_entry parts[7] = {};
+ 
+ 	parts[0] = make_partition_table(info->partitions);
+ 	if (info->soft_ver)
+@@ -836,6 +888,11 @@ static void build_image(const char *output,
+ 	parts[3] = read_file("os-image", kernel_image, false);
+ 	parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof);
+ 
++	if (strcasecmp(info->id, "ARCHER-C25-V1") == 0) {
++		const char mdat[11] = {0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00};
++		parts[5] = put_data("extra-para", mdat, 11);
++	}
++
+ 	size_t len;
+ 	void *image;
+ 	if (sysupgrade)
+-- 
+2.1.4
+
diff --git a/src/packages/fff/fff-network/Makefile b/src/packages/fff/fff-network/Makefile
index fee3f98..d34016c 100644
--- a/src/packages/fff/fff-network/Makefile
+++ b/src/packages/fff/fff-network/Makefile
@@ -1,7 +1,7 @@ 
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=fff-network
-PKG_VERSION:=0.0.6
+PKG_VERSION:=0.0.7
 PKG_RELEASE:=1
 
 PKG_BUILD_DIR:=$(BUILD_DIR)/fff-network
diff --git a/src/packages/fff/fff-network/ar71xx/network.archer-c25-v1 b/src/packages/fff/fff-network/ar71xx/network.archer-c25-v1
new file mode 100644
index 0000000..e524545
--- /dev/null
+++ b/src/packages/fff/fff-network/ar71xx/network.archer-c25-v1
@@ -0,0 +1,8 @@ 
+WANDEV=eth0
+SWITCHDEV=eth1
+CLIENT_PORTS="1 2 0t"
+WAN_PORTS=""
+BATMAN_PORTS="3 4 0t"
+
+ETHMESHMAC=eth1
+ROUTERMAC=eth0

Comments

Adrian Schmutzler July 16, 2017, 9:46 p.m.
Hallo,

hab heute mal mit nem C25 getestet:

Flashen hat wunderbar geklappt, aber:

- Beim Neustart blinkt der immer erst zweimal mit allen LEDs, was wie ein
Bootloop aussieht, aber zum Glück nur lästig ist, danach kommt er (meistens)
zunächst normal hoch.
- Die LEDs sind soweit plausibel.
- Bei mir startet er sich aber immer nach ca. 2 Minuten neu. Angekündigt
wird das durch eine langsamere Blinkfrequenz der schmalen Funk-LED sowie
etwaiger angeschlossener LAN-LEDs. Neustart tritt sowohl bei Betrieb über
Mesh als auch WAN-Verbindung auf. Zugang ist direkt und über Mesh-Router per
WebUI möglich, also kommt die Firmware zumindest teilweise hoch.
- Der Router ist bis jetzt nicht im Monitoring aufgetaucht (wahrscheinlich
weil er den 5 Minuten Timer nie erreicht).
- Einmal hatte ich nach der Trennung vom Netz das Problem, dass er gar nicht
mehr hochkam (nur Power blinkt, kein Login möglich; 5 Neustart-Versuche). Da
half es dann lustigerweise, ein LAN-Kabel einzustecken, danach ist der
Fehler aber nicht mehr aufgetreten.
- Danach hab ich einen Reset per "Knopf" versucht (um Fehlkonfiguration im
WebUI auszuschließen), hat jedoch nichts (am Problem) geändert.
- Was mich wundert: Jetzt muss ich mich richtig beeilen, dass ich im WebUI
was eingeben kann, bevor er abkackt. Ich meine, dass beim allerersten Mal,
bevor ich ihn vom Netz genommen habe, das nicht so war, und ich mehr Zeit
zum Einstellen hatte. Sicher bin ich mir da aber nicht mehr.

Hat jemand TFTP-IP und Image-Namen für das Ding? Ich würde gerne nochmal
flashen, aber ich trau mich nicht, ein sysupgrade zu machen, weil der dann
bestimmt währenddessen abkackt. TFTP sollte aber funktionieren, dann könnte
ich den o.g. Erstversuch ohne Neustart nach 2 min. nachstellen.

Beste Grüße

Adrian



-----Original Message-----
From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf Of Tim
Niemeyer
Sent: Samstag, 8. Juli 2017 13:00
To: franken-dev@freifunk.net
Subject: [PATCH v2 4/4] Add support for TP-Link C25

> Signed-off-by: Tim Niemeyer <tim@tn-x.org>
> ---

> Changes in v2:
> - Added kernel config for LEDs
> - Changed patch format
Adrian Schmutzler July 16, 2017, 11:30 p.m.
Hallo nochmal,

hab jetzt nochmal ein bisschen rumprobiert.

Nachdem ich den Router mal ein bisschen habe stehen lassen, hat er dann
zwischendurch auch mal etwa 10 Minuten durchgehalten und kam auch ins
Monitoring rein. Danach war aber immer wieder nach jeweils ca. 2 Minuten
Schluss, oder er kam gar nicht hoch.

TFTP habe ich inzwischen gefunden:
192.168.0.66
ArcherC25v1_recovery.bin
Ging bei mir mit Port 3

Habe dann mal die Versionen 1 und 2 von Tim's Patch mit TFTP versucht,
gleiches Ergebnis (nur halt mit LEDs alle an bei v1).

Uptime reicht nicht mal, um die Location zu setzen. K.A., ob man da ein Log
sinnvoll auslesen kann...

Grüße

Adrian

-----Original Message-----
From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf Of
mail@adrianschmutzler.de
Sent: Sonntag, 16. Juli 2017 23:47
To: 'Tim Niemeyer' <tim@tn-x.org>; franken-dev@freifunk.net
Subject: RE: [PATCH v2 4/4] Add support for TP-Link C25

Hallo,

hab heute mal mit nem C25 getestet:

Flashen hat wunderbar geklappt, aber:

- Beim Neustart blinkt der immer erst zweimal mit allen LEDs, was wie ein
Bootloop aussieht, aber zum Glück nur lästig ist, danach kommt er (meistens)
zunächst normal hoch.
- Die LEDs sind soweit plausibel.
- Bei mir startet er sich aber immer nach ca. 2 Minuten neu. Angekündigt
wird das durch eine langsamere Blinkfrequenz der schmalen Funk-LED sowie
etwaiger angeschlossener LAN-LEDs. Neustart tritt sowohl bei Betrieb über
Mesh als auch WAN-Verbindung auf. Zugang ist direkt und über Mesh-Router per
WebUI möglich, also kommt die Firmware zumindest teilweise hoch.
- Der Router ist bis jetzt nicht im Monitoring aufgetaucht (wahrscheinlich
weil er den 5 Minuten Timer nie erreicht).
- Einmal hatte ich nach der Trennung vom Netz das Problem, dass er gar nicht
mehr hochkam (nur Power blinkt, kein Login möglich; 5 Neustart-Versuche). Da
half es dann lustigerweise, ein LAN-Kabel einzustecken, danach ist der
Fehler aber nicht mehr aufgetreten.
- Danach hab ich einen Reset per "Knopf" versucht (um Fehlkonfiguration im
WebUI auszuschließen), hat jedoch nichts (am Problem) geändert.
- Was mich wundert: Jetzt muss ich mich richtig beeilen, dass ich im WebUI
was eingeben kann, bevor er abkackt. Ich meine, dass beim allerersten Mal,
bevor ich ihn vom Netz genommen habe, das nicht so war, und ich mehr Zeit
zum Einstellen hatte. Sicher bin ich mir da aber nicht mehr.

Hat jemand TFTP-IP und Image-Namen für das Ding? Ich würde gerne nochmal
flashen, aber ich trau mich nicht, ein sysupgrade zu machen, weil der dann
bestimmt währenddessen abkackt. TFTP sollte aber funktionieren, dann könnte
ich den o.g. Erstversuch ohne Neustart nach 2 min. nachstellen.

Beste Grüße

Adrian



-----Original Message-----
From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf Of Tim
Niemeyer
Sent: Samstag, 8. Juli 2017 13:00
To: franken-dev@freifunk.net
Subject: [PATCH v2 4/4] Add support for TP-Link C25

> Signed-off-by: Tim Niemeyer <tim@tn-x.org>
> ---

> Changes in v2:
> - Added kernel config for LEDs
> - Changed patch format


--
franken-dev mailing list
franken-dev@freifunk.net
http://lists.freifunk.net/mailman/listinfo/franken-dev-freifunk.net
Adrian Schmutzler July 19, 2017, 9:02 a.m.
Hab jetzt nochmal einen Test mit FFF-Firmware basierend auf dem LEDE master
gemacht, selbes Ergebnis.

Liegt also auch nicht daran, dass irgendein Patch vergessen oder was
nachträglich gefixt wurde.

-----Original Message-----
From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf Of
mail@adrianschmutzler.de
Sent: Montag, 17. Juli 2017 01:31
To: franken-dev@freifunk.net
Subject: RE: [PATCH v2 4/4] Add support for TP-Link C25

Hallo nochmal,

hab jetzt nochmal ein bisschen rumprobiert.

Nachdem ich den Router mal ein bisschen habe stehen lassen, hat er dann
zwischendurch auch mal etwa 10 Minuten durchgehalten und kam auch ins
Monitoring rein. Danach war aber immer wieder nach jeweils ca. 2 Minuten
Schluss, oder er kam gar nicht hoch.

TFTP habe ich inzwischen gefunden:
192.168.0.66
ArcherC25v1_recovery.bin
Ging bei mir mit Port 3

Habe dann mal die Versionen 1 und 2 von Tim's Patch mit TFTP versucht,
gleiches Ergebnis (nur halt mit LEDs alle an bei v1).

Uptime reicht nicht mal, um die Location zu setzen. K.A., ob man da ein Log
sinnvoll auslesen kann...

Grüße

Adrian

-----Original Message-----
From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf Of
mail@adrianschmutzler.de
Sent: Sonntag, 16. Juli 2017 23:47
To: 'Tim Niemeyer' <tim@tn-x.org>; franken-dev@freifunk.net
Subject: RE: [PATCH v2 4/4] Add support for TP-Link C25

Hallo,

hab heute mal mit nem C25 getestet:

Flashen hat wunderbar geklappt, aber:

- Beim Neustart blinkt der immer erst zweimal mit allen LEDs, was wie ein
Bootloop aussieht, aber zum Glück nur lästig ist, danach kommt er (meistens)
zunächst normal hoch.
- Die LEDs sind soweit plausibel.
- Bei mir startet er sich aber immer nach ca. 2 Minuten neu. Angekündigt
wird das durch eine langsamere Blinkfrequenz der schmalen Funk-LED sowie
etwaiger angeschlossener LAN-LEDs. Neustart tritt sowohl bei Betrieb über
Mesh als auch WAN-Verbindung auf. Zugang ist direkt und über Mesh-Router per
WebUI möglich, also kommt die Firmware zumindest teilweise hoch.
- Der Router ist bis jetzt nicht im Monitoring aufgetaucht (wahrscheinlich
weil er den 5 Minuten Timer nie erreicht).
- Einmal hatte ich nach der Trennung vom Netz das Problem, dass er gar nicht
mehr hochkam (nur Power blinkt, kein Login möglich; 5 Neustart-Versuche). Da
half es dann lustigerweise, ein LAN-Kabel einzustecken, danach ist der
Fehler aber nicht mehr aufgetreten.
- Danach hab ich einen Reset per "Knopf" versucht (um Fehlkonfiguration im
WebUI auszuschließen), hat jedoch nichts (am Problem) geändert.
- Was mich wundert: Jetzt muss ich mich richtig beeilen, dass ich im WebUI
was eingeben kann, bevor er abkackt. Ich meine, dass beim allerersten Mal,
bevor ich ihn vom Netz genommen habe, das nicht so war, und ich mehr Zeit
zum Einstellen hatte. Sicher bin ich mir da aber nicht mehr.

Hat jemand TFTP-IP und Image-Namen für das Ding? Ich würde gerne nochmal
flashen, aber ich trau mich nicht, ein sysupgrade zu machen, weil der dann
bestimmt währenddessen abkackt. TFTP sollte aber funktionieren, dann könnte
ich den o.g. Erstversuch ohne Neustart nach 2 min. nachstellen.

Beste Grüße

Adrian



-----Original Message-----
From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf Of Tim
Niemeyer
Sent: Samstag, 8. Juli 2017 13:00
To: franken-dev@freifunk.net
Subject: [PATCH v2 4/4] Add support for TP-Link C25

> Signed-off-by: Tim Niemeyer <tim@tn-x.org>
> ---

> Changes in v2:
> - Added kernel config for LEDs
> - Changed patch format


--
franken-dev mailing list
franken-dev@freifunk.net
http://lists.freifunk.net/mailman/listinfo/franken-dev-freifunk.net

--
franken-dev mailing list
franken-dev@freifunk.net
http://lists.freifunk.net/mailman/listinfo/franken-dev-freifunk.net
Adrian Schmutzler July 26, 2017, 7:59 p.m.
So, habe nun in der /etc/config/wireless herumgespielt.

Solange bei radio0 (also 5 GHz) "option disabled '1'" gesetzt ist, läuft er
wunderbar.

Mache ich aber auch nur eines der beiden interfaces an (also mesh ODER
w5ap), startet er alle 2 Minuten neu.

Heißt im Umkehrschluss, wenn man "uci set wireless.radio0.disabled=1" macht,
ist er immer noch ein günstigeres Replacement für den 1043er.

Nun kommt es denke ich darauf an, ob sich beim 9887 Treiber was tut, oder
hat noch jemand ne Idee...?

-----Original Message-----
From: mail@adrianschmutzler.de [mailto:mail@adrianschmutzler.de] 
Sent: Mittwoch, 19. Juli 2017 11:03
To: 'mail@adrianschmutzler.de' <mail@adrianschmutzler.de>;
'franken-dev@freifunk.net' <franken-dev@freifunk.net>
Subject: RE: [PATCH v2 4/4] Add support for TP-Link C25

Hab jetzt nochmal einen Test mit FFF-Firmware basierend auf dem LEDE master
gemacht, selbes Ergebnis.

Liegt also auch nicht daran, dass irgendein Patch vergessen oder was
nachträglich gefixt wurde.

-----Original Message-----
From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf Of
mail@adrianschmutzler.de
Sent: Montag, 17. Juli 2017 01:31
To: franken-dev@freifunk.net
Subject: RE: [PATCH v2 4/4] Add support for TP-Link C25

Hallo nochmal,

hab jetzt nochmal ein bisschen rumprobiert.

Nachdem ich den Router mal ein bisschen habe stehen lassen, hat er dann
zwischendurch auch mal etwa 10 Minuten durchgehalten und kam auch ins
Monitoring rein. Danach war aber immer wieder nach jeweils ca. 2 Minuten
Schluss, oder er kam gar nicht hoch.

TFTP habe ich inzwischen gefunden:
192.168.0.66
ArcherC25v1_recovery.bin
Ging bei mir mit Port 3

Habe dann mal die Versionen 1 und 2 von Tim's Patch mit TFTP versucht,
gleiches Ergebnis (nur halt mit LEDs alle an bei v1).

Uptime reicht nicht mal, um die Location zu setzen. K.A., ob man da ein Log
sinnvoll auslesen kann...

Grüße

Adrian

-----Original Message-----
From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf Of
mail@adrianschmutzler.de
Sent: Sonntag, 16. Juli 2017 23:47
To: 'Tim Niemeyer' <tim@tn-x.org>; franken-dev@freifunk.net
Subject: RE: [PATCH v2 4/4] Add support for TP-Link C25

Hallo,

hab heute mal mit nem C25 getestet:

Flashen hat wunderbar geklappt, aber:

- Beim Neustart blinkt der immer erst zweimal mit allen LEDs, was wie ein
Bootloop aussieht, aber zum Glück nur lästig ist, danach kommt er (meistens)
zunächst normal hoch.
- Die LEDs sind soweit plausibel.
- Bei mir startet er sich aber immer nach ca. 2 Minuten neu. Angekündigt
wird das durch eine langsamere Blinkfrequenz der schmalen Funk-LED sowie
etwaiger angeschlossener LAN-LEDs. Neustart tritt sowohl bei Betrieb über
Mesh als auch WAN-Verbindung auf. Zugang ist direkt und über Mesh-Router per
WebUI möglich, also kommt die Firmware zumindest teilweise hoch.
- Der Router ist bis jetzt nicht im Monitoring aufgetaucht (wahrscheinlich
weil er den 5 Minuten Timer nie erreicht).
- Einmal hatte ich nach der Trennung vom Netz das Problem, dass er gar nicht
mehr hochkam (nur Power blinkt, kein Login möglich; 5 Neustart-Versuche). Da
half es dann lustigerweise, ein LAN-Kabel einzustecken, danach ist der
Fehler aber nicht mehr aufgetreten.
- Danach hab ich einen Reset per "Knopf" versucht (um Fehlkonfiguration im
WebUI auszuschließen), hat jedoch nichts (am Problem) geändert.
- Was mich wundert: Jetzt muss ich mich richtig beeilen, dass ich im WebUI
was eingeben kann, bevor er abkackt. Ich meine, dass beim allerersten Mal,
bevor ich ihn vom Netz genommen habe, das nicht so war, und ich mehr Zeit
zum Einstellen hatte. Sicher bin ich mir da aber nicht mehr.

Hat jemand TFTP-IP und Image-Namen für das Ding? Ich würde gerne nochmal
flashen, aber ich trau mich nicht, ein sysupgrade zu machen, weil der dann
bestimmt währenddessen abkackt. TFTP sollte aber funktionieren, dann könnte
ich den o.g. Erstversuch ohne Neustart nach 2 min. nachstellen.

Beste Grüße

Adrian



-----Original Message-----
From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf Of Tim
Niemeyer
Sent: Samstag, 8. Juli 2017 13:00
To: franken-dev@freifunk.net
Subject: [PATCH v2 4/4] Add support for TP-Link C25

> Signed-off-by: Tim Niemeyer <tim@tn-x.org>
> ---

> Changes in v2:
> - Added kernel config for LEDs
> - Changed patch format


--
franken-dev mailing list
franken-dev@freifunk.net
http://lists.freifunk.net/mailman/listinfo/franken-dev-freifunk.net

--
franken-dev mailing list
franken-dev@freifunk.net
http://lists.freifunk.net/mailman/listinfo/franken-dev-freifunk.net
Adrian Schmutzler July 27, 2017, 11:30 a.m.
Hallo,

Reviewed-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
Tested-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>

Beides gilt nur in Kombination mit meinem Patch "[5/5] Archer C25: Disable 5
GHz to provide working firmware", der 5 GHz vollständig deaktiviert.

Ich bin dafür, das Paket C25 (Patches 1-5) jetzt erstmal zu applien, da er
mit 2.4 GHz stabil läuft und somit als Alternative zum 1043 geeignet ist.
Den Support für 5 GHz würde ich vorschlagen nachzureichen und nachzupatchen,
sobald jemand dazu in der Lage ist (vll. gibt’s ja auch noch einen neuen
Treiber).

Wer 5 GHz testen will, bräuchte dann nur den uci set aus dem Patch 5 lokal
wieder zu entfernen, die Treiber stehen ja weiterhin drin.

Zum 5 GHz nochmal zusammenfassend:
- Ich habe alle 2 min. Neustartloop, sobald auch nur ein Interface unter 5
GHz aktiviert ist (egal ob w5ap oder w5mesh)
- Nehme ich nur die Treiber ohne -ct, erscheint bei mir der physische
Adapter für 5 GHz gar nicht

Grüße

Adrian

> -----Original Message-----
> From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf
> Of Tim Niemeyer
> Sent: Samstag, 8. Juli 2017 13:00
> To: franken-dev@freifunk.net
> Subject: [PATCH v2 4/4] Add support for TP-Link C25
> 
> Signed-off-by: Tim Niemeyer <tim@tn-x.org>
> ---
> 
> Changes in v2:
> - Added kernel config for LEDs
> - Changed patch format
> 
>  bsp/ar71xx/.config                                 |   3 +
>  bsp/board_ar71xx.bsp                               |   1 +
>  ...ils-tplink-safeloader-support-strings-as-.patch | 162 +++++++
...1xx-add-
> support-for-TP-Link-Archer-C25-v1.patch | 499
> +++++++++++++++++++++
>  ...ils-tplink-safeloader-add-TP-Link-Archer-.patch | 112 +++++
>  src/packages/fff/fff-network/Makefile              |   2 +-
>  .../fff/fff-network/ar71xx/network.archer-c25-v1   |   8 +
>  7 files changed, 786 insertions(+), 1 deletion(-)  create mode 100644
> build_patches/openwrt/0005-firmware-utils-tplink-safeloader-support-
> string
> s-as-.patch
>  create mode 100644
> build_patches/openwrt/0006-ar71xx-add-support-for-TP-Link-Archer-C25-
> v1.pa
> tch
>  create mode 100644
> build_patches/openwrt/0007-firmware-utils-tplink-safeloader-add-TP-Link-
> Ar
> cher-.patch
>  create mode 100644
> src/packages/fff/fff-network/ar71xx/network.archer-c25-v1
> 
> diff --git a/bsp/ar71xx/.config b/bsp/ar71xx/.config index
43d063c..b407f7d
> 100644
> --- a/bsp/ar71xx/.config
> +++ b/bsp/ar71xx/.config
> @@ -6,6 +6,8 @@ CONFIG_TARGET_ar71xx_generic=y
> CONFIG_TARGET_MULTI_PROFILE=y
> CONFIG_TARGET_DEVICE_ar71xx_generic_DEVICE_gl-ar150=y
>  CONFIG_TARGET_DEVICE_PACKAGES_ar71xx_generic_DEVICE_gl-ar150=""
> +CONFIG_TARGET_DEVICE_ar71xx_generic_DEVICE_archer-c25-v1=y
> +CONFIG_TARGET_DEVICE_PACKAGES_ar71xx_generic_DEVICE_archer-c25-
> v1="-kmo
> +d-
> ath10k kmod-ath10k-ct -ath10k-firmware-qca9887 ath10k-firmware-qca9887-
> ct"
>  CONFIG_TARGET_DEVICE_ar71xx_generic_DEVICE_archer-c7-v2=y
> 
> CONFIG_TARGET_DEVICE_PACKAGES_ar71xx_generic_DEVICE_archer-c7-
> v2="-kmod-at
> h10k kmod-ath10k-ct -ath10k-firmware-qca988x ath10k-firmware-qca988x-
> ct"
>  CONFIG_TARGET_DEVICE_ar71xx_generic_DEVICE_cpe210-220=y
> @@ -83,6 +85,7 @@ CONFIG_CLEAN_IPKG=y
>  # CONFIG_KERNEL_DEBUG_INFO is not set
>  # CONFIG_KERNEL_DEBUG_KERNEL is not set  #
> CONFIG_PACKAGE_ALFRED_VIS is not set
> +CONFIG_PACKAGE_ath10k-firmware-qca9887-ct=m
>  CONFIG_PACKAGE_ath10k-firmware-qca988x-ct=m
>  CONFIG_PACKAGE_kmod-ath10k-ct=m
>  CONFIG_PACKAGE_kmod-hwmon-core=m
> diff --git a/bsp/board_ar71xx.bsp b/bsp/board_ar71xx.bsp index
> 6c541cc..1137b0d 100644
> --- a/bsp/board_ar71xx.bsp
> +++ b/bsp/board_ar71xx.bsp
> @@ -31,4 +31,5 @@
> images=("lede-ar71xx-generic-cpe210-220-squashfs-sysupgrade.bin"
>          "lede-ar71xx-generic-tl-wdr4300-v1-squashfs-sysupgrade.bin"
>          "lede-ar71xx-generic-tl-wdr4310-v1-squashfs-sysupgrade.bin"
>          "lede-ar71xx-generic-archer-c7-v2-squashfs-sysupgrade.bin"
> +        "lede-ar71xx-generic-archer-c25-v1-squashfs-sysupgrade.bin"
>          )
> diff --git
> a/build_patches/openwrt/0005-firmware-utils-tplink-safeloader-support-stri
> ngs-as-.patch
> b/build_patches/openwrt/0005-firmware-utils-tplink-safeloader-support-stri
> ngs-as-.patch
> new file mode 100644
> index 0000000..289322e
> --- /dev/null
> +++
> b/build_patches/openwrt/0005-firmware-utils-tplink-safeloader-support-stri
> ngs-as-.patch
> @@ -0,0 +1,162 @@
> +From e9ef329106fbf7e71718e73aee8b48315dd22a18 Mon Sep 17 00:00:00
> 2001
> +From: Jan Niehusmann <jan@gondor.com>
> +Date: Fri, 19 May 2017 09:42:24 +0200
> +Subject: [PATCH 5/7] firmware-utils: tplink-safeloader: support strings
> as
> + soft_version
> +
> +Some TP-Link routers (C25, C59, C60) contain a version string instead
> +of a binary structure in the soft_version partition.
> +
> +Flashing LEDE from the original firmware's GUI, this version string
> +taken from the soft_ver partition of the firmware image is written to
> +the router's config partition.
> +
> +When using tftp recovery to go back to the original Archer C25
> +firmware, a version check compares that version to the version of the
> +firmware to be flashed.
> +
> +Without proper contents in the config partition, reverting to the
> +original firmware fails.
> +
> +Therefore, write the string "soft_ver:1.0.0\n" to that soft_ver
> +partition.
> +
> +Signed-off-by: Jan Niehusmann <jan@gondor.com> [Rebased on v17.01.2]
> +Signed-off-by: Tim Niemeyer <tim@tnx-x.org>
> +---
> + tools/firmware-utils/src/tplink-safeloader.c | 34
> +++++++++++++++++++++++++++-
> + 1 file changed, 33 insertions(+), 1 deletion(-)
> +
> +diff --git a/tools/firmware-utils/src/tplink-safeloader.c
> b/tools/firmware-utils/src/tplink-safeloader.c
> +index 4e3d205..688cdac 100644
> +--- a/tools/firmware-utils/src/tplink-safeloader.c
> ++++ b/tools/firmware-utils/src/tplink-safeloader.c
> +@@ -75,6 +75,7 @@ struct device_info {
> + 	const char *vendor;
> + 	const char *support_list;
> + 	char support_trail;
> ++	const char *soft_ver;
> + 	const struct flash_partition_entry partitions[MAX_PARTITIONS+1];
> + 	const char *first_sysupgrade_partition;
> + 	const char *last_sysupgrade_partition; @@ -130,6 +131,7 @@ static
> +struct device_info boards[] = {
> + 			"CPE220(TP-LINK|US|N300-2):1.1\r\n"
> + 			"CPE220(TP-LINK|EU|N300-2):1.1\r\n",
> + 		.support_trail = '\xff',
> ++		.soft_ver = NULL,
> +
> + 		.partitions = {
> + 			{"fs-uboot", 0x00000, 0x20000},
> +@@ -167,6 +169,7 @@ static struct device_info boards[] = {
> + 			"CPE520(TP-LINK|US|N300-5):1.1\r\n"
> + 			"CPE520(TP-LINK|EU|N300-5):1.1\r\n",
> + 		.support_trail = '\xff',
> ++		.soft_ver = NULL,
> +
> + 		.partitions = {
> + 			{"fs-uboot", 0x00000, 0x20000},
> +@@ -198,6 +201,7 @@ static struct device_info boards[] = {
> + 			"WBS210(TP-LINK|US|N300-2):1.20\r\n"
> + 			"WBS210(TP-LINK|EU|N300-2):1.20\r\n",
> + 		.support_trail = '\xff',
> ++		.soft_ver = NULL,
> +
> + 		.partitions = {
> + 			{"fs-uboot", 0x00000, 0x20000},
> +@@ -229,6 +233,7 @@ static struct device_info boards[] = {
> + 			"WBS510(TP-LINK|US|N300-5):1.20\r\n"
> + 			"WBS510(TP-LINK|EU|N300-5):1.20\r\n",
> + 		.support_trail = '\xff',
> ++		.soft_ver = NULL,
> +
> + 		.partitions = {
> + 			{"fs-uboot", 0x00000, 0x20000},
> +@@ -259,6 +264,7 @@ static struct device_info boards[] = {
> + 			"SupportList:\r\n"
> + 			"{product_name:Archer
> C2600,product_ver:1.0.0,special_id:00000000}\r\n",
> + 		.support_trail = '\x00',
> ++		.soft_ver = NULL,
> +
> + 		.partitions = {
> + 			{"SBL1", 0x00000, 0x20000},
> +@@ -303,6 +309,7 @@ static struct device_info boards[] = {
> + 			"product_ver:2.0.0,"
> + 			"special_id:00000000}\r\n",
> + 		.support_trail = '\x00',
> ++		.soft_ver = NULL,
> +
> + 		.partitions = {
> + 			{"fs-uboot", 0x00000, 0x40000},
> +@@ -337,6 +344,7 @@ static struct device_info boards[] = {
> + 			"product_ver:1.0.0,"
> + 			"special_id:00000000}\n",
> + 		.support_trail = '\x00',
> ++		.soft_ver = NULL,
> +
> + 		.partitions = {
> + 			{"fs-uboot", 0x00000, 0x40000},
> +@@ -369,6 +377,7 @@ static struct device_info boards[] = {
> + 			"SupportList:\r\n"
> + 			"EAP120(TP-LINK|UN|N300-2):1.0\r\n",
> + 		.support_trail = '\xff',
> ++		.soft_ver = NULL,
> +
> + 		.partitions = {
> + 			{"fs-uboot", 0x00000, 0x20000},
> +@@ -398,6 +407,7 @@ static struct device_info boards[] = {
> + 			"SupportList:\n"
> +
> "{product_name:TL-WR1043ND,product_ver:4.0.0,special_id:45550000}\n",
> + 		.support_trail = '\x00',
> ++		.soft_ver = NULL,
> +
> + 		/**
> + 		    We use a bigger os-image partition than the stock
> images (and thus
> +@@ -441,6 +451,7 @@ static struct device_info boards[] = {
> +
> "{product_name:RE450,product_ver:1.0.0,special_id:4B520000}\r\n"
> +
> "{product_name:RE450,product_ver:1.0.0,special_id:55534100}\r\n",
> + 		.support_trail = '\x00',
> ++		.soft_ver = NULL,
> +
> + 		/**
> + 		   The flash partition table for RE450; @@ -569,6 +580,23 @@
> static
> +struct image_partition_entry
> make_soft_version(uint32_t rev) {
> + 	return entry;
> + }
> +
> ++static struct image_partition_entry
> ++make_soft_version_from_string(const
> char *soft_ver) {
> ++	/** String length _including_ the terminating zero byte */
> ++	uint32_t ver_len = strlen(soft_ver) + 1;
> ++	/** Partition contains 64 bit header, the version string, and one
> additional null byte */
> ++	size_t partition_len = 2*sizeof(uint32_t) + ver_len + 1;
> ++	struct image_partition_entry entry =
> alloc_image_partition("soft-version", partition_len);
> ++
> ++	uint32_t *len = (uint32_t *)entry.data;
> ++	len[0] = htonl(ver_len);
> ++	len[1] = 0;
> ++	memcpy(&len[2], soft_ver, ver_len);
> ++
> ++	entry.data[partition_len - 1] = 0;
> ++
> ++	return entry;
> ++}
> ++
> + /** Generates the support-list partition */ static struct
> + image_partition_entry make_support_list(const struct
> device_info *info) {
> + 	size_t len = strlen(info->support_list); @@ -799,7 +827,11 @@ static
> +void build_image(const char *output,
> + 	struct image_partition_entry parts[6] = {};
> +
> + 	parts[0] = make_partition_table(info->partitions);
> +-	parts[1] = make_soft_version(rev);
> ++	if (info->soft_ver)
> ++		parts[1] = make_soft_version_from_string(info->soft_ver);
> ++	else
> ++		parts[1] = make_soft_version(rev);
> ++
> + 	parts[2] = make_support_list(info);
> + 	parts[3] = read_file("os-image", kernel_image, false);
> + 	parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof);
> +--
> +2.1.4
> +
> diff --git
> a/build_patches/openwrt/0006-ar71xx-add-support-for-TP-Link-Archer-C25-
> v1.
> patch
> b/build_patches/openwrt/0006-ar71xx-add-support-for-TP-Link-Archer-C25-
> v1.
> patch
> new file mode 100644
> index 0000000..aa0f9ce
> --- /dev/null
> +++
> b/build_patches/openwrt/0006-ar71xx-add-support-for-TP-Link-Archer-C25-
> v1.
> patch
> @@ -0,0 +1,499 @@
> +From a5290bd7279f0aa4a7129ce103fec154239ddd86 Mon Sep 17 00:00:00
> 2001
> +From: Ludwig Thomeczek <ledesrc@wxorx.net>
> +Date: Sat, 22 Apr 2017 18:21:47 +0200
> +Subject: [PATCH 6/7] ar71xx: add support for TP-Link Archer C25 v1
> +
> +The TP-Link Archer C25 is a low-cost dual-band router.
> +
> +Specification:
> +
> +- CPU: Atheros QCA9561 775 MHz
> +- RAM: 64 MB
> +- Flash: 8 MB
> +- Wifi: 3x3 2.4 GHz (integrated), 1x1 5 GHz QCA9887
> +- NET: 5x 10/100 Mbps Ethernet
> +
> +Some LEDs are controlled by an additional 74HC595 chip.
> +
> +Signed-off-by: Ludwig Thomeczek <ledesrc@wxorx.net> [minor code style
> +fixes, boards alphabetical order fixes, reworked commit message]
> +Signed-off-by: Piotr Dymacz <pepe2k@gmail.com> [Rebased on v17.01.2]
> +Signed-off-by: Tim Niemeyer <tim@tnx-x.org>
> +---
> + target/linux/ar71xx/base-files/etc/board.d/01_leds |   9 +
> + .../linux/ar71xx/base-files/etc/board.d/02_network |   1 +
> + target/linux/ar71xx/base-files/etc/diag.sh         |   1 +
> + .../etc/hotplug.d/firmware/11-ath10k-caldata       |   1 +
> + target/linux/ar71xx/base-files/lib/ar71xx.sh       |   3 +
> + .../ar71xx/base-files/lib/upgrade/platform.sh      |   1 +
> + target/linux/ar71xx/config-4.4                     |   3 +
> + .../ar71xx/files/arch/mips/ath79/Kconfig.openwrt   |  11 +
> + target/linux/ar71xx/files/arch/mips/ath79/Makefile |   1 +
> + .../files/arch/mips/ath79/mach-archer-c25-v1.c     | 227
> +++++++++++++++++++++
> + .../linux/ar71xx/files/arch/mips/ath79/machtypes.h |   1 +
> + target/linux/ar71xx/image/tp-link.mk               |  24 +++
> + target/linux/ar71xx/mikrotik/config-default        |   1 +
> + target/linux/ar71xx/nand/config-default            |   1 +
> + 14 files changed, 285 insertions(+)
> + create mode 100644
> target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c
> +
> +diff --git a/target/linux/ar71xx/base-files/etc/board.d/01_leds
> b/target/linux/ar71xx/base-files/etc/board.d/01_leds
> +index 0279dfc..3aa2bfb 100755
> +--- a/target/linux/ar71xx/base-files/etc/board.d/01_leds
> ++++ b/target/linux/ar71xx/base-files/etc/board.d/01_leds
> +@@ -49,6 +49,15 @@ antrouter-r1)
> + 	ucidef_set_led_wlan "wlan" "WLAN" "$board:green:wlan" "phy0tpt"
> + 	ucidef_set_led_default "btc" "BTC" "$board:green:btc" "0"
> + 	;;
> ++archer-c25-v1)
> ++	ucidef_set_led_netdev "wan" "WAN" "$board:green:wan" "eth0"
> ++	ucidef_set_led_wlan "wlan" "WLAN" "$board:green:wlan2g"
> "phy1tpt"
> ++	ucidef_set_led_wlan "wlan5g" "WLAN5G" "$board:green:wlan5g"
> "phy0tpt"
> ++	ucidef_set_led_switch "lan1" "LAN1" "$board:green:lan1" "switch0"
> "0x10"
> ++	ucidef_set_led_switch "lan2" "LAN2" "$board:green:lan2" "switch0"
> "0x08"
> ++	ucidef_set_led_switch "lan3" "LAN3" "$board:green:lan3" "switch0"
> "0x04"
> ++	ucidef_set_led_switch "lan4" "LAN4" "$board:green:lan4" "switch0"
> "0x02"
> ++	;;
> + arduino-yun)
> + 	ucidef_set_led_wlan "wlan" "WLAN" "arduino:blue:wlan" "phy0tpt"
> + 	ucidef_set_led_usbdev "usb" "USB" "arduino:white:usb" "1-1.1"
> +diff --git a/target/linux/ar71xx/base-files/etc/board.d/02_network
> b/target/linux/ar71xx/base-files/etc/board.d/02_network
> +index c8c7827..4404e80 100755
> +--- a/target/linux/ar71xx/base-files/etc/board.d/02_network
> ++++ b/target/linux/ar71xx/base-files/etc/board.d/02_network
> +@@ -122,6 +122,7 @@ ar71xx_setup_interfaces()
> + 	a60|\
> + 	alfa-ap96|\
> + 	alfa-nx|\
> ++	archer-c25-v1|\
> + 	dr344|\
> + 	gl-ar150|\
> + 	gl-ar300m|\
> +diff --git a/target/linux/ar71xx/base-files/etc/diag.sh
> b/target/linux/ar71xx/base-files/etc/diag.sh
> +index 7b8aac8..cf6278c 100644
> +--- a/target/linux/ar71xx/base-files/etc/diag.sh
> ++++ b/target/linux/ar71xx/base-files/etc/diag.sh
> +@@ -47,6 +47,7 @@ get_status_led() {
> + 	ap135-020)
> + 		status_led="ap135:green:status"
> + 		;;
> ++	archer-c25-v1|\
> + 	mr12|\
> + 	mr16|\
> + 	nbg6616|\
> +diff --git
> a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> +index b3e23c9..68f90de 100644
> +---
> a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> ++++
> b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> +@@ -92,6 +92,7 @@ case "$FIRMWARE" in
> + 		ath10kcal_extract "art" 20480 2116
> + 		ath10kcal_patch_mac $(macaddr_add $(cat
> /sys/class/net/eth0/address) -2)
> + 		;;
> ++	archer-c25-v1|\
> + 	tl-wdr6500-v2)
> + 		ath10kcal_extract "art" 20480 2116
> + 		ath10kcal_patch_mac $(macaddr_add $(cat
> /sys/class/net/eth1/address) -2)
> +diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh
> b/target/linux/ar71xx/base-files/lib/ar71xx.sh
> +index b035535..0d01c5e 100755
> +--- a/target/linux/ar71xx/base-files/lib/ar71xx.sh
> ++++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh
> +@@ -457,6 +457,9 @@ ar71xx_board_detect() {
> + 	*AP90Q)
> + 		name="ap90q"
> + 		;;
> ++	*"Archer C25 v1")
> ++		name="archer-c25-v1"
> ++		;;
> + 	*"Archer C5")
> + 		name="archer-c5"
> + 		;;
> +diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> +index 580e09a..e2aaceb 100755
> +--- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> ++++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> +@@ -205,6 +205,7 @@ platform_check_image() {
> + 	airrouter|\
> + 	ap132|\
> + 	ap90q|\
> ++	archer-c25-v1|\
> + 	bullet-m|\
> + 	c-55|\
> + 	carambola2|\
> +diff --git a/target/linux/ar71xx/config-4.4
> b/target/linux/ar71xx/config-4.4
> +index ff6bb13..79308e8 100644
> +--- a/target/linux/ar71xx/config-4.4
> ++++ b/target/linux/ar71xx/config-4.4
> +@@ -50,6 +50,7 @@ CONFIG_ATH79_MACH_AP152=y  #
> CONFIG_ATH79_MACH_AP81
> +is not set  CONFIG_ATH79_MACH_AP90Q=y
> CONFIG_ATH79_MACH_AP96=y
> ++CONFIG_ATH79_MACH_ARCHER_C25_V1=y
> + CONFIG_ATH79_MACH_ARCHER_C7=y
> + CONFIG_ATH79_MACH_ARDUINO_YUN=y
> + CONFIG_ATH79_MACH_AW_NR580=y
> +@@ -269,6 +270,7 @@ CONFIG_GENERIC_SMP_IDLE_THREAD=y
> +CONFIG_GENERIC_TIME_VSYSCALL=y  CONFIG_GPIOLIB=y
> +CONFIG_GPIOLIB_IRQCHIP=y
> ++CONFIG_GPIO_74X164=y
> + CONFIG_GPIO_DEVRES=y
> + # CONFIG_GPIO_LATCH is not set
> + CONFIG_GPIO_NXP_74HC153=y
> +@@ -335,6 +337,7 @@ CONFIG_LEDS_NU801=y  CONFIG_LIBFDT=y
> +CONFIG_MARVELL_PHY=y  CONFIG_MDIO_BITBANG=y
> ++CONFIG_SPI_GPIO=y
> + CONFIG_MDIO_BOARDINFO=y
> + CONFIG_MDIO_GPIO=y
> + CONFIG_MICREL_PHY=y
> +diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> +index 76ba6fa..d49659c 100644
> +--- a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> ++++ b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> +@@ -1224,6 +1224,17 @@ config ATH79_MACH_BSB
> + 	select ATH79_DEV_USB
> + 	select ATH79_DEV_WMAC
> +
> ++config ATH79_MACH_ARCHER_C25_V1
> ++	bool "TP-LINK Archer C25 v1 support"
> ++	select SOC_QCA956X
> ++	select ATH79_DEV_AP9X_PCI if PCI
> ++	select ATH79_DEV_ETH
> ++	select ATH79_DEV_GPIO_BUTTONS
> ++	select ATH79_DEV_LEDS_GPIO
> ++	select ATH79_DEV_M25P80
> ++	select ATH79_DEV_WMAC
> ++
> ++
> + config ATH79_MACH_ARCHER_C7
> + 	bool "TP-LINK Archer C5/C7/TL-WDR4900 v2 board support"
> + 	select SOC_QCA955X
> +diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Makefile
> b/target/linux/ar71xx/files/arch/mips/ath79/Makefile
> +index c91d03f..fc28716 100644
> +--- a/target/linux/ar71xx/files/arch/mips/ath79/Makefile
> ++++ b/target/linux/ar71xx/files/arch/mips/ath79/Makefile
> +@@ -55,6 +55,7 @@ obj-$(CONFIG_ATH79_MACH_AP147)
> 	+=
> mach-ap147.o
> + obj-$(CONFIG_ATH79_MACH_AP152)			+= mach-
> ap152.o
> + obj-$(CONFIG_ATH79_MACH_AP90Q)			+= mach-
> ap90q.o
> + obj-$(CONFIG_ATH79_MACH_AP96)			+= mach-
> ap96.o
> ++obj-$(CONFIG_ATH79_MACH_ARCHER_C25_V1)		+=
> mach-archer-c25-v1.o
> + obj-$(CONFIG_ATH79_MACH_ARCHER_C7)		+= mach-archer-c7.o
> + obj-$(CONFIG_ATH79_MACH_ARDUINO_YUN)		+= mach-
> arduino-yun.o
> + obj-$(CONFIG_ATH79_MACH_AW_NR580)		+= mach-aw-nr580.o
> +diff --git
> a/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c
> b/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c
> +new file mode 100644
> +index 0000000..a0f001c
> +--- /dev/null
> ++++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c
> +@@ -0,0 +1,227 @@
> ++/*
> ++ *  TP-Link Archer C25 v1 board support
> ++ *
> ++ *  Copyright (C) 2017 Ludwig Thomeczek <ledesrc@wxorx.net>
> ++ *  based on mach-archer-c60/C59-v1.c
> ++ *  Copyright (C) 2016 Henryk Heisig <hyniu@o2.pl>
> ++ *
> ++ *  This program is free software; you can redistribute it and/or
> ++modify
> it
> ++ *  under the terms of the GNU General Public License version 2 as
> published
> ++ *  by the Free Software Foundation.
> ++ */
> ++#include <linux/platform_device.h>
> ++#include <linux/ath9k_platform.h>
> ++#include <linux/ar8216_platform.h>
> ++#include <asm/mach-ath79/ar71xx_regs.h> #include <linux/gpio.h>
> ++
> ++#include "common.h"
> ++#include "dev-m25p80.h"
> ++#include "machtypes.h"
> ++#include "pci.h"
> ++#include "dev-ap9x-pci.h"
> ++#include "dev-eth.h"
> ++#include "dev-gpio-buttons.h"
> ++#include "dev-leds-gpio.h"
> ++#include "dev-spi.h"
> ++#include "dev-usb.h"
> ++#include "dev-wmac.h"
> ++#include <linux/spi/spi_gpio.h>
> ++#include <linux/spi/74x164.h>
> ++
> ++#define ARCHER_C25_GPIO_SHIFT_OE	21 /* OE,   Output Enable */
> ++#define ARCHER_C25_GPIO_SHIFT_SER	14 /* DS,   Data Serial Input */
> ++#define ARCHER_C25_GPIO_SHIFT_SRCLK	15 /* SHCP, Shift Reg Clock
> Input
> */
> ++#define ARCHER_C25_GPIO_SHIFT_SRCLR	19 /* MR,   Master Reset */
> ++#define ARCHER_C25_GPIO_SHIFT_RCLK	16 /* STCP, Storage Reg Clock
> Input */
> ++
> ++#define ARCHER_C25_74HC_GPIO_BASE
> 	QCA956X_GPIO_COUNT
> ++#define ARCHER_C25_74HC_GPIO_LED_WAN_AMBER	27
> ++#define ARCHER_C25_74HC_GPIO_LED_WAN_GREEN	28
> ++#define ARCHER_C25_74HC_GPIO_LED_WLAN2		29
> ++#define ARCHER_C25_74HC_GPIO_LED_WLAN5		30
> ++#define ARCHER_C25_74HC_GPIO_LED_LAN1		23
> ++#define ARCHER_C25_74HC_GPIO_LED_LAN2		24
> ++#define ARCHER_C25_74HC_GPIO_LED_LAN3		25
> ++#define ARCHER_C25_74HC_GPIO_LED_LAN4		26
> ++
> ++#define ARCHER_C25_V1_SSR_BIT_0			0
> ++#define ARCHER_C25_V1_SSR_BIT_1			1
> ++#define ARCHER_C25_V1_SSR_BIT_2			2
> ++#define ARCHER_C25_V1_SSR_BIT_3			3
> ++#define ARCHER_C25_V1_SSR_BIT_4			4
> ++#define ARCHER_C25_V1_SSR_BIT_5			5
> ++#define ARCHER_C25_V1_SSR_BIT_6			6
> ++#define ARCHER_C25_V1_SSR_BIT_7			7
> ++
> ++
> ++#define ARCHER_C25_V1_KEYS_POLL_INTERVAL	20
> ++#define ARCHER_C25_V1_KEYS_DEBOUNCE_INTERVAL	\
> ++					(3 *
> ARCHER_C25_V1_KEYS_POLL_INTERVAL)
> ++
> ++#define ARCHER_C25_V1_GPIO_BTN_RESET		1
> ++#define ARCHER_C25_V1_GPIO_BTN_RFKILL		22
> ++
> ++#define ARCHER_C25_V1_GPIO_LED_POWER		17
> ++#define ARCHER_C25_V1_GPIO_LED_WPS		2
> ++
> ++#define ARCHER_C25_V1_WMAC_CALDATA_OFFSET	0x1000
> ++
> ++static struct spi_gpio_platform_data archer_c25_v1_spi_data = {
> ++	.sck		= ARCHER_C25_GPIO_SHIFT_SRCLK,
> ++	.miso		= SPI_GPIO_NO_MISO,
> ++	.mosi		= ARCHER_C25_GPIO_SHIFT_SER,
> ++	.num_chipselect	= 1,
> ++};
> ++
> ++static u8 archer_c25_v1_ssr_initdata[] __initdata = {
> ++	BIT(ARCHER_C25_V1_SSR_BIT_7) |
> ++	BIT(ARCHER_C25_V1_SSR_BIT_6) |
> ++	BIT(ARCHER_C25_V1_SSR_BIT_5) |
> ++	BIT(ARCHER_C25_V1_SSR_BIT_4) |
> ++	BIT(ARCHER_C25_V1_SSR_BIT_3) |
> ++	BIT(ARCHER_C25_V1_SSR_BIT_2) |
> ++	BIT(ARCHER_C25_V1_SSR_BIT_1)
> ++};
> ++
> ++static struct gen_74x164_chip_platform_data archer_c25_v1_ssr_data = {
> ++	.base = ARCHER_C25_74HC_GPIO_BASE,
> ++	.num_registers = ARRAY_SIZE(archer_c25_v1_ssr_initdata),
> ++	.init_data = archer_c25_v1_ssr_initdata, };
> ++
> ++static struct platform_device archer_c25_v1_spi_device = {
> ++	.name		= "spi_gpio",
> ++	.id		= 1,
> ++	.dev = {
> ++		.platform_data = &archer_c25_v1_spi_data,
> ++	},
> ++};
> ++
> ++static struct spi_board_info archer_c25_v1_spi_info[] = {
> ++	{
> ++		.bus_num		= 1,
> ++		.chip_select		= 0,
> ++		.max_speed_hz		= 10000000,
> ++		.modalias		= "74x164",
> ++		.platform_data		= &archer_c25_v1_ssr_data,
> ++		.controller_data	= (void *)
> ARCHER_C25_GPIO_SHIFT_RCLK,
> ++	},
> ++};
> ++
> ++static struct gpio_led archer_c25_v1_leds_gpio[] __initdata = {
> ++	{
> ++		.name		= "archer-c25-v1:green:power",
> ++		.gpio		= ARCHER_C25_V1_GPIO_LED_POWER,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:wps",
> ++		.gpio		= ARCHER_C25_V1_GPIO_LED_WPS,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:wlan2g",
> ++		.gpio		= ARCHER_C25_74HC_GPIO_LED_WLAN2,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:wlan5g",
> ++		.gpio		= ARCHER_C25_74HC_GPIO_LED_WLAN5,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:lan1",
> ++		.gpio		= ARCHER_C25_74HC_GPIO_LED_LAN1,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:lan2",
> ++		.gpio		= ARCHER_C25_74HC_GPIO_LED_LAN2,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:lan3",
> ++		.gpio		= ARCHER_C25_74HC_GPIO_LED_LAN3,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:lan4",
> ++		.gpio		= ARCHER_C25_74HC_GPIO_LED_LAN4,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:wan",
> ++		.gpio		=
> ARCHER_C25_74HC_GPIO_LED_WAN_GREEN,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:amber:wan",
> ++		.gpio		=
> ARCHER_C25_74HC_GPIO_LED_WAN_AMBER,
> ++		.active_low	= 1,
> ++	},
> ++};
> ++
> ++static struct gpio_keys_button archer_c25_v1_gpio_keys[] __initdata = {
> ++	{
> ++		.desc			= "Reset button",
> ++		.type			= EV_KEY,
> ++		.code			= KEY_RESTART,
> ++		.debounce_interval	=
> ARCHER_C25_V1_KEYS_DEBOUNCE_INTERVAL,
> ++		.gpio			= ARCHER_C25_V1_GPIO_BTN_RESET,
> ++		.active_low		= 1,
> ++	}, {
> ++		.desc			= "RFKILL button",
> ++		.type			= EV_KEY,
> ++		.code			= KEY_RFKILL,
> ++		.debounce_interval	=
> ARCHER_C25_V1_KEYS_DEBOUNCE_INTERVAL,
> ++		.gpio			=
> ARCHER_C25_V1_GPIO_BTN_RFKILL,
> ++		.active_low		= 1,
> ++	},
> ++};
> ++
> ++static void __init archer_c25_v1_setup(void) {
> ++	u8 *mac = (u8 *) KSEG1ADDR(0x1f7e0008);
> ++	u8 *art = (u8 *) KSEG1ADDR(0x1f7f0000);
> ++
> ++	ath79_register_m25p80(NULL);
> ++
> ++	spi_register_board_info(archer_c25_v1_spi_info,
> ++				ARRAY_SIZE(archer_c25_v1_spi_info));
> ++
> ++	platform_device_register(&archer_c25_v1_spi_device);
> ++
> ++	gpio_request_one(ARCHER_C25_GPIO_SHIFT_OE,
> ++			 GPIOF_OUT_INIT_LOW |
> GPIOF_EXPORT_DIR_FIXED,
> ++			 "LED control");
> ++
> ++	gpio_request_one(ARCHER_C25_GPIO_SHIFT_SRCLR,
> ++			 GPIOF_OUT_INIT_HIGH |
> GPIOF_EXPORT_DIR_FIXED,
> ++			 "LED reset");
> ++
> ++	ath79_register_leds_gpio(-1,
> ARRAY_SIZE(archer_c25_v1_leds_gpio),
> ++				 archer_c25_v1_leds_gpio);
> ++
> ++	ath79_register_gpio_keys_polled(-1,
> ARCHER_C25_V1_KEYS_POLL_INTERVAL,
> ++
> ARRAY_SIZE(archer_c25_v1_gpio_keys),
> ++					archer_c25_v1_gpio_keys);
> ++
> ++	ath79_register_mdio(0, 0x0);
> ++	ath79_register_mdio(1, 0x0);
> ++
> ++	ath79_init_mac(ath79_eth0_data.mac_addr, mac, 0);
> ++	ath79_init_mac(ath79_eth1_data.mac_addr, mac, 1);
> ++
> ++	/* WAN port */
> ++	ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
> ++	ath79_eth0_data.speed = SPEED_100;
> ++	ath79_eth0_data.duplex = DUPLEX_FULL;
> ++	ath79_eth0_data.phy_mask = BIT(4);
> ++	ath79_register_eth(0);
> ++
> ++	/* LAN ports */
> ++	ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII;
> ++	ath79_eth1_data.speed = SPEED_1000;
> ++	ath79_eth1_data.duplex = DUPLEX_FULL;
> ++	ath79_switch_data.phy_poll_mask |= BIT(4);
> ++	ath79_switch_data.phy4_mii_en = 1;
> ++	ath79_register_eth(1);
> ++
> ++	ath79_register_wmac(art +
> ARCHER_C25_V1_WMAC_CALDATA_OFFSET, mac);
> ++	ap91_pci_init(NULL, NULL);
> ++}
> ++
> ++MIPS_MACHINE(ATH79_MACH_ARCHER_C25_V1, "ARCHER-C25-V1", "TP-
> LINK
> ++Archer
> C25 v1",
> ++	     archer_c25_v1_setup);
> +diff --git a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> +index b9a8e3e..53f0d1c 100644
> +--- a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> ++++ b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> +@@ -39,6 +39,7 @@ enum ath79_mach_type {
> + 	ATH79_MACH_AP152,			/* Atheros AP152 reference
> board */
> + 	ATH79_MACH_AP90Q,			/* YunCore AP90Q */
> + 	ATH79_MACH_AP96,			/* Atheros AP96 */
> ++	ATH79_MACH_ARCHER_C25_V1,		/* TP-LINK Archer C25
> V1
> board */
> + 	ATH79_MACH_ARCHER_C5,			/* TP-LINK Archer C5
> board
> */
> + 	ATH79_MACH_ARCHER_C7,			/* TP-LINK Archer C7
> board
> */
> + 	ATH79_MACH_ARCHER_C7_V2,		/* TP-LINK Archer C7
> V2
> board */
> +diff --git a/target/linux/ar71xx/image/tp-link.mk
> b/target/linux/ar71xx/image/tp-link.mk
> +index 1c88f43..f70c12c 100644
> +--- a/target/linux/ar71xx/image/tp-link.mk
> ++++ b/target/linux/ar71xx/image/tp-link.mk
> +@@ -45,6 +45,14 @@ define Build/mktplinkfw-kernel
> + 	@mv $@.new $@
> + endef
> +
> ++define Build/uImageArcher
> ++	mkimage -A $(LINUX_KARCH) \
> ++			-O linux -T kernel \
> ++			-C $(1) -a $(KERNEL_LOADADDR) -e $(if
> $(KERNEL_ENTRY),$(KERNEL_ENTRY),$(KERNEL_LOADADDR)) \
> ++			-n '$(call toupper,$(LINUX_KARCH)) LEDE
> Linux-$(LINUX_VERSION)' -d $@ $@.new
> ++	@mv $@.new $@
> ++endef
> ++
> + define Device/tplink
> +   TPLINK_HWREV := 0x1
> +   TPLINK_HEADER_VERSION := 1
> +@@ -95,6 +103,22 @@ $(Device/tplink)
> +   IMAGE_SIZE := 15872k
> + endef
> +
> ++define Device/archer-c25-v1
> ++  DEVICE_TITLE := TP-LINK Archer C25 v1
> ++  DEVICE_PACKAGES := kmod-ath10k ath10k-firmware-qca9887
> ++  BOARDNAME := ARCHER-C25-V1
> ++  TPLINK_BOARD_NAME := ARCHER-C25-V1
> ++  DEVICE_PROFILE := ARCHERC25V1
> ++  IMAGE_SIZE := 7808k
> ++  LOADER_TYPE := elf
> ++  KERNEL := kernel-bin | patch-cmdline | lzma | uImageArcher lzma
> ++  IMAGES := sysupgrade.bin factory.bin
> ++  IMAGE/sysupgrade.bin := append-rootfs | tplink-safeloader sysupgrade
> ++  IMAGE/factory.bin := append-rootfs | tplink-safeloader factory
> ++  MTDPARTS :=
> spi0.0:128k(factory-uboot)ro,64k(u-boot)ro,1536k(kernel),6272k(rootfs),128
> k(config)ro,64k(art)ro,7808k@0x30000(firmware)
> ++endef
> ++TARGET_DEVICES += archer-c25-v1
> ++
> + define Device/cpe510-520
> +   DEVICE_TITLE := TP-LINK CPE510/520
> +   DEVICE_PACKAGES := rssileds
> +diff --git a/target/linux/ar71xx/mikrotik/config-default
> b/target/linux/ar71xx/mikrotik/config-default
> +index 44ea327..3f11c23 100644
> +--- a/target/linux/ar71xx/mikrotik/config-default
> ++++ b/target/linux/ar71xx/mikrotik/config-default
> +@@ -15,6 +15,7 @@
> + # CONFIG_ATH79_MACH_AP152 is not set
> + # CONFIG_ATH79_MACH_AP90Q is not set
> + # CONFIG_ATH79_MACH_AP96 is not set
> ++# CONFIG_ATH79_MACH_ARCHER_C25_V1 is not set
> + # CONFIG_ATH79_MACH_ARCHER_C7 is not set  #
> +CONFIG_ATH79_MACH_ARDUINO_YUN is not set  #
> CONFIG_ATH79_MACH_AW_NR580
> +is not set diff --git a/target/linux/ar71xx/nand/config-default
> b/target/linux/ar71xx/nand/config-default
> +index 515266b..6357531 100644
> +--- a/target/linux/ar71xx/nand/config-default
> ++++ b/target/linux/ar71xx/nand/config-default
> +@@ -8,6 +8,7 @@
> + # CONFIG_ATH79_MACH_AP136 is not set
> + # CONFIG_ATH79_MACH_AP147 is not set
> + # CONFIG_ATH79_MACH_AP96 is not set
> ++# CONFIG_ATH79_MACH_ARCHER_C25_V1 is not set
> + # CONFIG_ATH79_MACH_ARCHER_C7 is not set  #
> CONFIG_ATH79_MACH_AW_NR580
> +is not set  # CONFIG_ATH79_MACH_CAP324 is not set
> +--
> +2.1.4
> +
> diff --git
> a/build_patches/openwrt/0007-firmware-utils-tplink-safeloader-add-TP-
> Link-
> Archer-.patch
> b/build_patches/openwrt/0007-firmware-utils-tplink-safeloader-add-TP-
> Link-
> Archer-.patch
> new file mode 100644
> index 0000000..861ccfd
> --- /dev/null
> +++
> b/build_patches/openwrt/0007-firmware-utils-tplink-safeloader-add-TP-
> Link-
> Archer-.patch
> @@ -0,0 +1,112 @@
> +From ae91fb7f8cef0fbd9b0ee707ce577ac9c5cdf2f2 Mon Sep 17 00:00:00
> 2001
> +From: Ludwig Thomeczek <ledesrc@wxorx.net>
> +Date: Sat, 13 May 2017 11:40:48 +0200
> +Subject: [PATCH 7/7] firmware-utils: tplink-safeloader: add TP-Link
> Archer C25
> + v1
> +
> +This adds the necessary firmware layout definitions for the Archer C25.
> +It has an addtional partition containing some static data
> +("extra-para") without which no factory flash is possible, therefore
> +put_data() has been added.
> +
> +Signed-off-by: Ludwig Thomeczek <ledesrc@wxorx.net> [Rebased on
> +v17.01.2]
> +Signed-off-by: Tim Niemeyer <tim@tnx-x.org>
> +---
> + tools/firmware-utils/src/tplink-safeloader.c | 59
> +++++++++++++++++++++++++++-
> + 1 file changed, 58 insertions(+), 1 deletion(-)
> +
> +diff --git a/tools/firmware-utils/src/tplink-safeloader.c
> b/tools/firmware-utils/src/tplink-safeloader.c
> +index 688cdac..2468426 100644
> +--- a/tools/firmware-utils/src/tplink-safeloader.c
> ++++ b/tools/firmware-utils/src/tplink-safeloader.c
> +@@ -299,6 +299,48 @@ static struct device_info boards[] = {
> + 		.last_sysupgrade_partition = "file-system"
> + 	},
> +
> ++	/** Firmware layout for the C25v1 */
> ++	{
> ++		.id = "ARCHER-C25-V1",
> ++		.support_list =
> ++			"SupportList:\n"
> ++
> "{product_name:ArcherC25,product_ver:1.0.0,special_id:00000000}\n"
> ++
> "{product_name:ArcherC25,product_ver:1.0.0,special_id:55530000}\n"
> ++
> "{product_name:ArcherC25,product_ver:1.0.0,special_id:45550000}\n",
> ++		.support_trail = '\x00',
> ++		.soft_ver = "soft_ver:1.0.0\n",
> ++
> ++		/**
> ++		    We use a bigger os-image partition than the stock
> images (and thus
> ++		    smaller file-system), as our kernel doesn't fit in the
> stock firmware's
> ++		    1MB os-image.
> ++		*/
> ++		.partitions = {
> ++			{"factory-boot", 0x00000, 0x20000},
> ++			{"fs-uboot", 0x20000, 0x10000},
> ++			{"os-image", 0x30000, 0x180000},	/* Stock:
> base 0x30000 size 0x100000 */
> ++			{"file-system", 0x1b0000, 0x620000},	/* Stock:
> base 0x130000 size 0x6a0000 */
> ++			{"user-config", 0x7d0000, 0x04000},
> ++			{"default-mac", 0x7e0000, 0x00100},
> ++			{"device-id", 0x7e0100, 0x00100},
> ++			{"extra-para", 0x7e0200, 0x00100},
> ++			{"pin", 0x7e0300, 0x00100},
> ++			{"support-list", 0x7e0400, 0x00400},
> ++			{"soft-version", 0x7e0800, 0x00400},
> ++			{"product-info", 0x7e0c00, 0x01400},
> ++			{"partition-table", 0x7e2000, 0x01000},
> ++			{"profile", 0x7e3000, 0x01000},
> ++			{"default-config", 0x7e4000, 0x04000},
> ++			{"merge-config", 0x7ec000, 0x02000},
> ++			{"qos-db", 0x7ee000, 0x02000},
> ++			{"radio", 0x7f0000, 0x10000},
> ++			{NULL, 0, 0}
> ++		},
> ++
> ++		.first_sysupgrade_partition = "os-image",
> ++		.last_sysupgrade_partition = "file-system",
> ++	},
> ++
> + 	/** Firmware layout for the C5 */
> + 	{
> + 		.id = "ARCHER-C5-V2",
> +@@ -643,6 +685,15 @@ static struct image_partition_entry
> +read_file(const
> char *part_name, const char
> + 	return entry;
> + }
> +
> ++/** Creates a new image partition from arbitrary data */ static struct
> ++image_partition_entry put_data(const char *part_name,
> const char *datain, size_t len) {
> ++
> ++	struct image_partition_entry entry =
> alloc_image_partition(part_name, len);
> ++
> ++	memcpy(entry.data, datain, len);
> ++
> ++	return entry;
> ++}
> +
> + /**
> +    Copies a list of image partitions into an image buffer and
> + generates
> the image partition table while doing so
> +@@ -824,7 +875,8 @@ static void build_image(const char *output,
> + 		bool add_jffs2_eof,
> + 		bool sysupgrade,
> + 		const struct device_info *info) {
> +-	struct image_partition_entry parts[6] = {};
> ++
> ++	struct image_partition_entry parts[7] = {};
> +
> + 	parts[0] = make_partition_table(info->partitions);
> + 	if (info->soft_ver)
> +@@ -836,6 +888,11 @@ static void build_image(const char *output,
> + 	parts[3] = read_file("os-image", kernel_image, false);
> + 	parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof);
> +
> ++	if (strcasecmp(info->id, "ARCHER-C25-V1") == 0) {
> ++		const char mdat[11] = {0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
> 0x00, 0x00, 0x01, 0x00, 0x00};
> ++		parts[5] = put_data("extra-para", mdat, 11);
> ++	}
> ++
> + 	size_t len;
> + 	void *image;
> + 	if (sysupgrade)
> +--
> +2.1.4
> +
> diff --git a/src/packages/fff/fff-network/Makefile
> b/src/packages/fff/fff-network/Makefile
> index fee3f98..d34016c 100644
> --- a/src/packages/fff/fff-network/Makefile
> +++ b/src/packages/fff/fff-network/Makefile
> @@ -1,7 +1,7 @@
>  include $(TOPDIR)/rules.mk
> 
>  PKG_NAME:=fff-network
> -PKG_VERSION:=0.0.6
> +PKG_VERSION:=0.0.7
>  PKG_RELEASE:=1
> 
>  PKG_BUILD_DIR:=$(BUILD_DIR)/fff-network
> diff --git a/src/packages/fff/fff-network/ar71xx/network.archer-c25-v1
> b/src/packages/fff/fff-network/ar71xx/network.archer-c25-v1
> new file mode 100644
> index 0000000..e524545
> --- /dev/null
> +++ b/src/packages/fff/fff-network/ar71xx/network.archer-c25-v1
> @@ -0,0 +1,8 @@
> +WANDEV=eth0
> +SWITCHDEV=eth1
> +CLIENT_PORTS="1 2 0t"
> +WAN_PORTS=""
> +BATMAN_PORTS="3 4 0t"
> +
> +ETHMESHMAC=eth1
> +ROUTERMAC=eth0
> --
> 2.1.4
> 
> --
> franken-dev mailing list
> franken-dev@freifunk.net
> http://lists.freifunk.net/mailman/listinfo/franken-dev-freifunk.net
Adrian Schmutzler Aug. 14, 2017, 7:35 p.m.
Habe gerade versucht, den neueren Treiber aus der Gluon-Diskussion zu
benutzen:

https://github.com/freifunk-gluon/gluon/issues/1123

https://github.com/rotanid/source/commit/89c17b4699946b8ebf916ea2a008015e26b
aaa89

Das Ergebnis ist dasselbe, sobald 5 Ghz aktiviert ist, erfolgt alle 2 min
ein Neustart.

-----Original Message-----
From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf Of
Adrian Schmutzler
Sent: Donnerstag, 27. Juli 2017 13:31
To: 'Tim Niemeyer' <tim@tn-x.org>; franken-dev@freifunk.net
Subject: RE: [PATCH v2 4/4] Add support for TP-Link C25

Hallo,

> Reviewed-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> Tested-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>

Beides gilt nur in Kombination mit meinem Patch "[5/5] Archer C25: Disable
5
GHz to provide working firmware", der 5 GHz vollständig deaktiviert.

Ich bin dafür, das Paket C25 (Patches 1-5) jetzt erstmal zu applien, da er
mit 2.4 GHz stabil läuft und somit als Alternative zum 1043 geeignet ist.
Den Support für 5 GHz würde ich vorschlagen nachzureichen und nachzupatchen,
sobald jemand dazu in der Lage ist (vll. gibt’s ja auch noch einen neuen
Treiber).

Wer 5 GHz testen will, bräuchte dann nur den uci set aus dem Patch 5 lokal
wieder zu entfernen, die Treiber stehen ja weiterhin drin.

Zum 5 GHz nochmal zusammenfassend:
- Ich habe alle 2 min. Neustartloop, sobald auch nur ein Interface unter 5
GHz aktiviert ist (egal ob w5ap oder w5mesh)
- Nehme ich nur die Treiber ohne -ct, erscheint bei mir der physische
Adapter für 5 GHz gar nicht

Grüße

Adrian

> -----Original Message-----
> From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf 
> Of Tim Niemeyer
> Sent: Samstag, 8. Juli 2017 13:00
> To: franken-dev@freifunk.net
> Subject: [PATCH v2 4/4] Add support for TP-Link C25
>
> Signed-off-by: Tim Niemeyer <tim@tn-x.org>
> ---
>
> Changes in v2:
> - Added kernel config for LEDs
> - Changed patch format
>
>  bsp/ar71xx/.config                                 |   3 +
>  bsp/board_ar71xx.bsp                               |   1 +
>  ...ils-tplink-safeloader-support-strings-as-.patch | 162 +++++++
...1xx-add-
> support-for-TP-Link-Archer-C25-v1.patch | 499
> +++++++++++++++++++++
>  ...ils-tplink-safeloader-add-TP-Link-Archer-.patch | 112 +++++
>  src/packages/fff/fff-network/Makefile              |   2 +-
>  .../fff/fff-network/ar71xx/network.archer-c25-v1   |   8 +
>  7 files changed, 786 insertions(+), 1 deletion(-)  create mode 100644
> build_patches/openwrt/0005-firmware-utils-tplink-safeloader-support-
> string
> s-as-.patch
>  create mode 100644
> build_patches/openwrt/0006-ar71xx-add-support-for-TP-Link-Archer-C25-
> v1.pa
> tch
>  create mode 100644
> build_patches/openwrt/0007-firmware-utils-tplink-safeloader-add-TP-Lin
> k-
> Ar
> cher-.patch
>  create mode 100644
> src/packages/fff/fff-network/ar71xx/network.archer-c25-v1
>
> diff --git a/bsp/ar71xx/.config b/bsp/ar71xx/.config index
43d063c..b407f7d
> 100644
> --- a/bsp/ar71xx/.config
> +++ b/bsp/ar71xx/.config
> @@ -6,6 +6,8 @@ CONFIG_TARGET_ar71xx_generic=y 
> CONFIG_TARGET_MULTI_PROFILE=y 
> CONFIG_TARGET_DEVICE_ar71xx_generic_DEVICE_gl-ar150=y
>  CONFIG_TARGET_DEVICE_PACKAGES_ar71xx_generic_DEVICE_gl-ar150=""
> +CONFIG_TARGET_DEVICE_ar71xx_generic_DEVICE_archer-c25-v1=y
> +CONFIG_TARGET_DEVICE_PACKAGES_ar71xx_generic_DEVICE_archer-c25-
> v1="-kmo
> +d-
> ath10k kmod-ath10k-ct -ath10k-firmware-qca9887 
> ath10k-firmware-qca9887- ct"
>  CONFIG_TARGET_DEVICE_ar71xx_generic_DEVICE_archer-c7-v2=y
>
> CONFIG_TARGET_DEVICE_PACKAGES_ar71xx_generic_DEVICE_archer-c7-
> v2="-kmod-at
> h10k kmod-ath10k-ct -ath10k-firmware-qca988x ath10k-firmware-qca988x- 
> ct"
>  CONFIG_TARGET_DEVICE_ar71xx_generic_DEVICE_cpe210-220=y
> @@ -83,6 +85,7 @@ CONFIG_CLEAN_IPKG=y
>  # CONFIG_KERNEL_DEBUG_INFO is not set  # CONFIG_KERNEL_DEBUG_KERNEL 
> is not set  # CONFIG_PACKAGE_ALFRED_VIS is not set
> +CONFIG_PACKAGE_ath10k-firmware-qca9887-ct=m
>  CONFIG_PACKAGE_ath10k-firmware-qca988x-ct=m
>  CONFIG_PACKAGE_kmod-ath10k-ct=m
>  CONFIG_PACKAGE_kmod-hwmon-core=m
> diff --git a/bsp/board_ar71xx.bsp b/bsp/board_ar71xx.bsp index 
> 6c541cc..1137b0d 100644
> --- a/bsp/board_ar71xx.bsp
> +++ b/bsp/board_ar71xx.bsp
> @@ -31,4 +31,5 @@
> images=("lede-ar71xx-generic-cpe210-220-squashfs-sysupgrade.bin"
>          "lede-ar71xx-generic-tl-wdr4300-v1-squashfs-sysupgrade.bin"
>          "lede-ar71xx-generic-tl-wdr4310-v1-squashfs-sysupgrade.bin"
>          "lede-ar71xx-generic-archer-c7-v2-squashfs-sysupgrade.bin"
> +        "lede-ar71xx-generic-archer-c25-v1-squashfs-sysupgrade.bin"
>          )
> diff --git
>
a/build_patches/openwrt/0005-firmware-utils-tplink-safeloader-support-stri
> ngs-as-.patch
>
b/build_patches/openwrt/0005-firmware-utils-tplink-safeloader-support-stri
> ngs-as-.patch
> new file mode 100644
> index 0000000..289322e
> --- /dev/null
> +++
>
b/build_patches/openwrt/0005-firmware-utils-tplink-safeloader-support-stri
> ngs-as-.patch
> @@ -0,0 +1,162 @@
> +From e9ef329106fbf7e71718e73aee8b48315dd22a18 Mon Sep 17 00:00:00
> 2001
> +From: Jan Niehusmann <jan@gondor.com>
> +Date: Fri, 19 May 2017 09:42:24 +0200
> +Subject: [PATCH 5/7] firmware-utils: tplink-safeloader: support 
> +strings
> as
> + soft_version
> +
> +Some TP-Link routers (C25, C59, C60) contain a version string instead 
> +of a binary structure in the soft_version partition.
> +
> +Flashing LEDE from the original firmware's GUI, this version string 
> +taken from the soft_ver partition of the firmware image is written to 
> +the router's config partition.
> +
> +When using tftp recovery to go back to the original Archer C25 
> +firmware, a version check compares that version to the version of the 
> +firmware to be flashed.
> +
> +Without proper contents in the config partition, reverting to the 
> +original firmware fails.
> +
> +Therefore, write the string "soft_ver:1.0.0\n" to that soft_ver 
> +partition.
> +
> +Signed-off-by: Jan Niehusmann <jan@gondor.com> [Rebased on v17.01.2]
> +Signed-off-by: Tim Niemeyer <tim@tnx-x.org>
> +---
> + tools/firmware-utils/src/tplink-safeloader.c | 34
> +++++++++++++++++++++++++++-
> + 1 file changed, 33 insertions(+), 1 deletion(-)
> +
> +diff --git a/tools/firmware-utils/src/tplink-safeloader.c
> b/tools/firmware-utils/src/tplink-safeloader.c
> +index 4e3d205..688cdac 100644
> +--- a/tools/firmware-utils/src/tplink-safeloader.c
> ++++ b/tools/firmware-utils/src/tplink-safeloader.c
> +@@ -75,6 +75,7 @@ struct device_info {
> + 	const char *vendor;
> + 	const char *support_list;
> + 	char support_trail;
> ++	const char *soft_ver;
> + 	const struct flash_partition_entry partitions[MAX_PARTITIONS+1];
> + 	const char *first_sysupgrade_partition;
> + 	const char *last_sysupgrade_partition; @@ -130,6 +131,7 @@ static 
> +struct device_info boards[] = {
> + 			"CPE220(TP-LINK|US|N300-2):1.1\r\n"
> + 			"CPE220(TP-LINK|EU|N300-2):1.1\r\n",
> + 		.support_trail = '\xff',
> ++		.soft_ver = NULL,
> +
> + 		.partitions = {
> + 			{"fs-uboot", 0x00000, 0x20000},
> +@@ -167,6 +169,7 @@ static struct device_info boards[] = {
> + 			"CPE520(TP-LINK|US|N300-5):1.1\r\n"
> + 			"CPE520(TP-LINK|EU|N300-5):1.1\r\n",
> + 		.support_trail = '\xff',
> ++		.soft_ver = NULL,
> +
> + 		.partitions = {
> + 			{"fs-uboot", 0x00000, 0x20000},
> +@@ -198,6 +201,7 @@ static struct device_info boards[] = {
> + 			"WBS210(TP-LINK|US|N300-2):1.20\r\n"
> + 			"WBS210(TP-LINK|EU|N300-2):1.20\r\n",
> + 		.support_trail = '\xff',
> ++		.soft_ver = NULL,
> +
> + 		.partitions = {
> + 			{"fs-uboot", 0x00000, 0x20000},
> +@@ -229,6 +233,7 @@ static struct device_info boards[] = {
> + 			"WBS510(TP-LINK|US|N300-5):1.20\r\n"
> + 			"WBS510(TP-LINK|EU|N300-5):1.20\r\n",
> + 		.support_trail = '\xff',
> ++		.soft_ver = NULL,
> +
> + 		.partitions = {
> + 			{"fs-uboot", 0x00000, 0x20000},
> +@@ -259,6 +264,7 @@ static struct device_info boards[] = {
> + 			"SupportList:\r\n"
> + 			"{product_name:Archer
> C2600,product_ver:1.0.0,special_id:00000000}\r\n",
> + 		.support_trail = '\x00',
> ++		.soft_ver = NULL,
> +
> + 		.partitions = {
> + 			{"SBL1", 0x00000, 0x20000},
> +@@ -303,6 +309,7 @@ static struct device_info boards[] = {
> + 			"product_ver:2.0.0,"
> + 			"special_id:00000000}\r\n",
> + 		.support_trail = '\x00',
> ++		.soft_ver = NULL,
> +
> + 		.partitions = {
> + 			{"fs-uboot", 0x00000, 0x40000},
> +@@ -337,6 +344,7 @@ static struct device_info boards[] = {
> + 			"product_ver:1.0.0,"
> + 			"special_id:00000000}\n",
> + 		.support_trail = '\x00',
> ++		.soft_ver = NULL,
> +
> + 		.partitions = {
> + 			{"fs-uboot", 0x00000, 0x40000},
> +@@ -369,6 +377,7 @@ static struct device_info boards[] = {
> + 			"SupportList:\r\n"
> + 			"EAP120(TP-LINK|UN|N300-2):1.0\r\n",
> + 		.support_trail = '\xff',
> ++		.soft_ver = NULL,
> +
> + 		.partitions = {
> + 			{"fs-uboot", 0x00000, 0x20000},
> +@@ -398,6 +407,7 @@ static struct device_info boards[] = {
> + 			"SupportList:\n"
> +
> "{product_name:TL-WR1043ND,product_ver:4.0.0,special_id:45550000}\n",
> + 		.support_trail = '\x00',
> ++		.soft_ver = NULL,
> +
> + 		/**
> + 		    We use a bigger os-image partition than the stock
> images (and thus
> +@@ -441,6 +451,7 @@ static struct device_info boards[] = {
> +
> "{product_name:RE450,product_ver:1.0.0,special_id:4B520000}\r\n"
> +
> "{product_name:RE450,product_ver:1.0.0,special_id:55534100}\r\n",
> + 		.support_trail = '\x00',
> ++		.soft_ver = NULL,
> +
> + 		/**
> + 		   The flash partition table for RE450; @@ -569,6 +580,23
@@
> static
> +struct image_partition_entry
> make_soft_version(uint32_t rev) {
> + 	return entry;
> + }
> +
> ++static struct image_partition_entry
> ++make_soft_version_from_string(const
> char *soft_ver) {
> ++	/** String length _including_ the terminating zero byte */
> ++	uint32_t ver_len = strlen(soft_ver) + 1;
> ++	/** Partition contains 64 bit header, the version string, and one
> additional null byte */
> ++	size_t partition_len = 2*sizeof(uint32_t) + ver_len + 1;
> ++	struct image_partition_entry entry =
> alloc_image_partition("soft-version", partition_len);
> ++
> ++	uint32_t *len = (uint32_t *)entry.data;
> ++	len[0] = htonl(ver_len);
> ++	len[1] = 0;
> ++	memcpy(&len[2], soft_ver, ver_len);
> ++
> ++	entry.data[partition_len - 1] = 0;
> ++
> ++	return entry;
> ++}
> ++
> + /** Generates the support-list partition */ static struct 
> + image_partition_entry make_support_list(const struct
> device_info *info) {
> + 	size_t len = strlen(info->support_list); @@ -799,7 +827,11 @@
static
> +void build_image(const char *output,
> + 	struct image_partition_entry parts[6] = {};
> +
> + 	parts[0] = make_partition_table(info->partitions);
> +-	parts[1] = make_soft_version(rev);
> ++	if (info->soft_ver)
> ++		parts[1] = make_soft_version_from_string(info->soft_ver);
> ++	else
> ++		parts[1] = make_soft_version(rev);
> ++
> + 	parts[2] = make_support_list(info);
> + 	parts[3] = read_file("os-image", kernel_image, false);
> + 	parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof);
> +--
> +2.1.4
> +
> diff --git
> a/build_patches/openwrt/0006-ar71xx-add-support-for-TP-Link-Archer-C25
> -
> v1.
> patch
> b/build_patches/openwrt/0006-ar71xx-add-support-for-TP-Link-Archer-C25
> -
> v1.
> patch
> new file mode 100644
> index 0000000..aa0f9ce
> --- /dev/null
> +++
> b/build_patches/openwrt/0006-ar71xx-add-support-for-TP-Link-Archer-C25
> -
> v1.
> patch
> @@ -0,0 +1,499 @@
> +From a5290bd7279f0aa4a7129ce103fec154239ddd86 Mon Sep 17 00:00:00
> 2001
> +From: Ludwig Thomeczek <ledesrc@wxorx.net>
> +Date: Sat, 22 Apr 2017 18:21:47 +0200
> +Subject: [PATCH 6/7] ar71xx: add support for TP-Link Archer C25 v1
> +
> +The TP-Link Archer C25 is a low-cost dual-band router.
> +
> +Specification:
> +
> +- CPU: Atheros QCA9561 775 MHz
> +- RAM: 64 MB
> +- Flash: 8 MB
> +- Wifi: 3x3 2.4 GHz (integrated), 1x1 5 GHz QCA9887
> +- NET: 5x 10/100 Mbps Ethernet
> +
> +Some LEDs are controlled by an additional 74HC595 chip.
> +
> +Signed-off-by: Ludwig Thomeczek <ledesrc@wxorx.net> [minor code style 
> +fixes, boards alphabetical order fixes, reworked commit message]
> +Signed-off-by: Piotr Dymacz <pepe2k@gmail.com> [Rebased on v17.01.2]
> +Signed-off-by: Tim Niemeyer <tim@tnx-x.org>
> +---
> + target/linux/ar71xx/base-files/etc/board.d/01_leds |   9 +
> + .../linux/ar71xx/base-files/etc/board.d/02_network |   1 +
> + target/linux/ar71xx/base-files/etc/diag.sh         |   1 +
> + .../etc/hotplug.d/firmware/11-ath10k-caldata       |   1 +
> + target/linux/ar71xx/base-files/lib/ar71xx.sh       |   3 +
> + .../ar71xx/base-files/lib/upgrade/platform.sh      |   1 +
> + target/linux/ar71xx/config-4.4                     |   3 +
> + .../ar71xx/files/arch/mips/ath79/Kconfig.openwrt   |  11 +
> + target/linux/ar71xx/files/arch/mips/ath79/Makefile |   1 +
> + .../files/arch/mips/ath79/mach-archer-c25-v1.c     | 227
> +++++++++++++++++++++
> + .../linux/ar71xx/files/arch/mips/ath79/machtypes.h |   1 +
> + target/linux/ar71xx/image/tp-link.mk               |  24 +++
> + target/linux/ar71xx/mikrotik/config-default        |   1 +
> + target/linux/ar71xx/nand/config-default            |   1 +
> + 14 files changed, 285 insertions(+)
> + create mode 100644
> target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c
> +
> +diff --git a/target/linux/ar71xx/base-files/etc/board.d/01_leds
> b/target/linux/ar71xx/base-files/etc/board.d/01_leds
> +index 0279dfc..3aa2bfb 100755
> +--- a/target/linux/ar71xx/base-files/etc/board.d/01_leds
> ++++ b/target/linux/ar71xx/base-files/etc/board.d/01_leds
> +@@ -49,6 +49,15 @@ antrouter-r1)
> + 	ucidef_set_led_wlan "wlan" "WLAN" "$board:green:wlan" "phy0tpt"
> + 	ucidef_set_led_default "btc" "BTC" "$board:green:btc" "0"
> + 	;;
> ++archer-c25-v1)
> ++	ucidef_set_led_netdev "wan" "WAN" "$board:green:wan" "eth0"
> ++	ucidef_set_led_wlan "wlan" "WLAN" "$board:green:wlan2g"
> "phy1tpt"
> ++	ucidef_set_led_wlan "wlan5g" "WLAN5G" "$board:green:wlan5g"
> "phy0tpt"
> ++	ucidef_set_led_switch "lan1" "LAN1" "$board:green:lan1" "switch0"
> "0x10"
> ++	ucidef_set_led_switch "lan2" "LAN2" "$board:green:lan2" "switch0"
> "0x08"
> ++	ucidef_set_led_switch "lan3" "LAN3" "$board:green:lan3" "switch0"
> "0x04"
> ++	ucidef_set_led_switch "lan4" "LAN4" "$board:green:lan4" "switch0"
> "0x02"
> ++	;;
> + arduino-yun)
> + 	ucidef_set_led_wlan "wlan" "WLAN" "arduino:blue:wlan" "phy0tpt"
> + 	ucidef_set_led_usbdev "usb" "USB" "arduino:white:usb" "1-1.1"
> +diff --git a/target/linux/ar71xx/base-files/etc/board.d/02_network
> b/target/linux/ar71xx/base-files/etc/board.d/02_network
> +index c8c7827..4404e80 100755
> +--- a/target/linux/ar71xx/base-files/etc/board.d/02_network
> ++++ b/target/linux/ar71xx/base-files/etc/board.d/02_network
> +@@ -122,6 +122,7 @@ ar71xx_setup_interfaces()
> + 	a60|\
> + 	alfa-ap96|\
> + 	alfa-nx|\
> ++	archer-c25-v1|\
> + 	dr344|\
> + 	gl-ar150|\
> + 	gl-ar300m|\
> +diff --git a/target/linux/ar71xx/base-files/etc/diag.sh
> b/target/linux/ar71xx/base-files/etc/diag.sh
> +index 7b8aac8..cf6278c 100644
> +--- a/target/linux/ar71xx/base-files/etc/diag.sh
> ++++ b/target/linux/ar71xx/base-files/etc/diag.sh
> +@@ -47,6 +47,7 @@ get_status_led() {
> + 	ap135-020)
> + 		status_led="ap135:green:status"
> + 		;;
> ++	archer-c25-v1|\
> + 	mr12|\
> + 	mr16|\
> + 	nbg6616|\
> +diff --git
>
a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
>
b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> +index b3e23c9..68f90de 100644
> +---
>
a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> ++++
>
b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> +@@ -92,6 +92,7 @@ case "$FIRMWARE" in
> + 		ath10kcal_extract "art" 20480 2116
> + 		ath10kcal_patch_mac $(macaddr_add $(cat
> /sys/class/net/eth0/address) -2)
> + 		;;
> ++	archer-c25-v1|\
> + 	tl-wdr6500-v2)
> + 		ath10kcal_extract "art" 20480 2116
> + 		ath10kcal_patch_mac $(macaddr_add $(cat
> /sys/class/net/eth1/address) -2)
> +diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh
> b/target/linux/ar71xx/base-files/lib/ar71xx.sh
> +index b035535..0d01c5e 100755
> +--- a/target/linux/ar71xx/base-files/lib/ar71xx.sh
> ++++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh
> +@@ -457,6 +457,9 @@ ar71xx_board_detect() {
> + 	*AP90Q)
> + 		name="ap90q"
> + 		;;
> ++	*"Archer C25 v1")
> ++		name="archer-c25-v1"
> ++		;;
> + 	*"Archer C5")
> + 		name="archer-c5"
> + 		;;
> +diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> +index 580e09a..e2aaceb 100755
> +--- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> ++++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> +@@ -205,6 +205,7 @@ platform_check_image() {
> + 	airrouter|\
> + 	ap132|\
> + 	ap90q|\
> ++	archer-c25-v1|\
> + 	bullet-m|\
> + 	c-55|\
> + 	carambola2|\
> +diff --git a/target/linux/ar71xx/config-4.4
> b/target/linux/ar71xx/config-4.4
> +index ff6bb13..79308e8 100644
> +--- a/target/linux/ar71xx/config-4.4
> ++++ b/target/linux/ar71xx/config-4.4
> +@@ -50,6 +50,7 @@ CONFIG_ATH79_MACH_AP152=y  #
> CONFIG_ATH79_MACH_AP81
> +is not set  CONFIG_ATH79_MACH_AP90Q=y
> CONFIG_ATH79_MACH_AP96=y
> ++CONFIG_ATH79_MACH_ARCHER_C25_V1=y
> + CONFIG_ATH79_MACH_ARCHER_C7=y
> + CONFIG_ATH79_MACH_ARDUINO_YUN=y
> + CONFIG_ATH79_MACH_AW_NR580=y
> +@@ -269,6 +270,7 @@ CONFIG_GENERIC_SMP_IDLE_THREAD=y 
> +CONFIG_GENERIC_TIME_VSYSCALL=y  CONFIG_GPIOLIB=y 
> +CONFIG_GPIOLIB_IRQCHIP=y
> ++CONFIG_GPIO_74X164=y
> + CONFIG_GPIO_DEVRES=y
> + # CONFIG_GPIO_LATCH is not set
> + CONFIG_GPIO_NXP_74HC153=y
> +@@ -335,6 +337,7 @@ CONFIG_LEDS_NU801=y  CONFIG_LIBFDT=y 
> +CONFIG_MARVELL_PHY=y  CONFIG_MDIO_BITBANG=y
> ++CONFIG_SPI_GPIO=y
> + CONFIG_MDIO_BOARDINFO=y
> + CONFIG_MDIO_GPIO=y
> + CONFIG_MICREL_PHY=y
> +diff --git 
> +a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> +index 76ba6fa..d49659c 100644
> +--- a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> ++++ b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> +@@ -1224,6 +1224,17 @@ config ATH79_MACH_BSB
> + 	select ATH79_DEV_USB
> + 	select ATH79_DEV_WMAC
> +
> ++config ATH79_MACH_ARCHER_C25_V1
> ++	bool "TP-LINK Archer C25 v1 support"
> ++	select SOC_QCA956X
> ++	select ATH79_DEV_AP9X_PCI if PCI
> ++	select ATH79_DEV_ETH
> ++	select ATH79_DEV_GPIO_BUTTONS
> ++	select ATH79_DEV_LEDS_GPIO
> ++	select ATH79_DEV_M25P80
> ++	select ATH79_DEV_WMAC
> ++
> ++
> + config ATH79_MACH_ARCHER_C7
> + 	bool "TP-LINK Archer C5/C7/TL-WDR4900 v2 board support"
> + 	select SOC_QCA955X
> +diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Makefile
> b/target/linux/ar71xx/files/arch/mips/ath79/Makefile
> +index c91d03f..fc28716 100644
> +--- a/target/linux/ar71xx/files/arch/mips/ath79/Makefile
> ++++ b/target/linux/ar71xx/files/arch/mips/ath79/Makefile
> +@@ -55,6 +55,7 @@ obj-$(CONFIG_ATH79_MACH_AP147)
> 	+=
> mach-ap147.o
> + obj-$(CONFIG_ATH79_MACH_AP152)			+= mach-
> ap152.o
> + obj-$(CONFIG_ATH79_MACH_AP90Q)			+= mach-
> ap90q.o
> + obj-$(CONFIG_ATH79_MACH_AP96)			+= mach-
> ap96.o
> ++obj-$(CONFIG_ATH79_MACH_ARCHER_C25_V1)		+=
> mach-archer-c25-v1.o
> + obj-$(CONFIG_ATH79_MACH_ARCHER_C7)		+= mach-archer-c7.o
> + obj-$(CONFIG_ATH79_MACH_ARDUINO_YUN)		+= mach-
> arduino-yun.o
> + obj-$(CONFIG_ATH79_MACH_AW_NR580)		+= mach-aw-nr580.o
> +diff --git
> a/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c
> b/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c
> +new file mode 100644
> +index 0000000..a0f001c
> +--- /dev/null
> ++++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c
> +@@ -0,0 +1,227 @@
> ++/*
> ++ *  TP-Link Archer C25 v1 board support
> ++ *
> ++ *  Copyright (C) 2017 Ludwig Thomeczek <ledesrc@wxorx.net>
> ++ *  based on mach-archer-c60/C59-v1.c
> ++ *  Copyright (C) 2016 Henryk Heisig <hyniu@o2.pl>
> ++ *
> ++ *  This program is free software; you can redistribute it and/or 
> ++modify
> it
> ++ *  under the terms of the GNU General Public License version 2 as
> published
> ++ *  by the Free Software Foundation.
> ++ */
> ++#include <linux/platform_device.h>
> ++#include <linux/ath9k_platform.h>
> ++#include <linux/ar8216_platform.h>
> ++#include <asm/mach-ath79/ar71xx_regs.h> #include <linux/gpio.h>
> ++
> ++#include "common.h"
> ++#include "dev-m25p80.h"
> ++#include "machtypes.h"
> ++#include "pci.h"
> ++#include "dev-ap9x-pci.h"
> ++#include "dev-eth.h"
> ++#include "dev-gpio-buttons.h"
> ++#include "dev-leds-gpio.h"
> ++#include "dev-spi.h"
> ++#include "dev-usb.h"
> ++#include "dev-wmac.h"
> ++#include <linux/spi/spi_gpio.h>
> ++#include <linux/spi/74x164.h>
> ++
> ++#define ARCHER_C25_GPIO_SHIFT_OE	21 /* OE,   Output Enable */
> ++#define ARCHER_C25_GPIO_SHIFT_SER	14 /* DS,   Data Serial Input */
> ++#define ARCHER_C25_GPIO_SHIFT_SRCLK	15 /* SHCP, Shift Reg Clock
> Input
> */
> ++#define ARCHER_C25_GPIO_SHIFT_SRCLR	19 /* MR,   Master Reset */
> ++#define ARCHER_C25_GPIO_SHIFT_RCLK	16 /* STCP, Storage Reg Clock
> Input */
> ++
> ++#define ARCHER_C25_74HC_GPIO_BASE
> 	QCA956X_GPIO_COUNT
> ++#define ARCHER_C25_74HC_GPIO_LED_WAN_AMBER	27
> ++#define ARCHER_C25_74HC_GPIO_LED_WAN_GREEN	28
> ++#define ARCHER_C25_74HC_GPIO_LED_WLAN2		29
> ++#define ARCHER_C25_74HC_GPIO_LED_WLAN5		30
> ++#define ARCHER_C25_74HC_GPIO_LED_LAN1		23
> ++#define ARCHER_C25_74HC_GPIO_LED_LAN2		24
> ++#define ARCHER_C25_74HC_GPIO_LED_LAN3		25
> ++#define ARCHER_C25_74HC_GPIO_LED_LAN4		26
> ++
> ++#define ARCHER_C25_V1_SSR_BIT_0			0
> ++#define ARCHER_C25_V1_SSR_BIT_1			1
> ++#define ARCHER_C25_V1_SSR_BIT_2			2
> ++#define ARCHER_C25_V1_SSR_BIT_3			3
> ++#define ARCHER_C25_V1_SSR_BIT_4			4
> ++#define ARCHER_C25_V1_SSR_BIT_5			5
> ++#define ARCHER_C25_V1_SSR_BIT_6			6
> ++#define ARCHER_C25_V1_SSR_BIT_7			7
> ++
> ++
> ++#define ARCHER_C25_V1_KEYS_POLL_INTERVAL	20
> ++#define ARCHER_C25_V1_KEYS_DEBOUNCE_INTERVAL	\
> ++					(3 *
> ARCHER_C25_V1_KEYS_POLL_INTERVAL)
> ++
> ++#define ARCHER_C25_V1_GPIO_BTN_RESET		1
> ++#define ARCHER_C25_V1_GPIO_BTN_RFKILL		22
> ++
> ++#define ARCHER_C25_V1_GPIO_LED_POWER		17
> ++#define ARCHER_C25_V1_GPIO_LED_WPS		2
> ++
> ++#define ARCHER_C25_V1_WMAC_CALDATA_OFFSET	0x1000
> ++
> ++static struct spi_gpio_platform_data archer_c25_v1_spi_data = {
> ++	.sck		= ARCHER_C25_GPIO_SHIFT_SRCLK,
> ++	.miso		= SPI_GPIO_NO_MISO,
> ++	.mosi		= ARCHER_C25_GPIO_SHIFT_SER,
> ++	.num_chipselect	= 1,
> ++};
> ++
> ++static u8 archer_c25_v1_ssr_initdata[] __initdata = {
> ++	BIT(ARCHER_C25_V1_SSR_BIT_7) |
> ++	BIT(ARCHER_C25_V1_SSR_BIT_6) |
> ++	BIT(ARCHER_C25_V1_SSR_BIT_5) |
> ++	BIT(ARCHER_C25_V1_SSR_BIT_4) |
> ++	BIT(ARCHER_C25_V1_SSR_BIT_3) |
> ++	BIT(ARCHER_C25_V1_SSR_BIT_2) |
> ++	BIT(ARCHER_C25_V1_SSR_BIT_1)
> ++};
> ++
> ++static struct gen_74x164_chip_platform_data archer_c25_v1_ssr_data = {
> ++	.base = ARCHER_C25_74HC_GPIO_BASE,
> ++	.num_registers = ARRAY_SIZE(archer_c25_v1_ssr_initdata),
> ++	.init_data = archer_c25_v1_ssr_initdata, };
> ++
> ++static struct platform_device archer_c25_v1_spi_device = {
> ++	.name		= "spi_gpio",
> ++	.id		= 1,
> ++	.dev = {
> ++		.platform_data = &archer_c25_v1_spi_data,
> ++	},
> ++};
> ++
> ++static struct spi_board_info archer_c25_v1_spi_info[] = {
> ++	{
> ++		.bus_num		= 1,
> ++		.chip_select		= 0,
> ++		.max_speed_hz		= 10000000,
> ++		.modalias		= "74x164",
> ++		.platform_data		= &archer_c25_v1_ssr_data,
> ++		.controller_data	= (void *)
> ARCHER_C25_GPIO_SHIFT_RCLK,
> ++	},
> ++};
> ++
> ++static struct gpio_led archer_c25_v1_leds_gpio[] __initdata = {
> ++	{
> ++		.name		= "archer-c25-v1:green:power",
> ++		.gpio		= ARCHER_C25_V1_GPIO_LED_POWER,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:wps",
> ++		.gpio		= ARCHER_C25_V1_GPIO_LED_WPS,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:wlan2g",
> ++		.gpio		= ARCHER_C25_74HC_GPIO_LED_WLAN2,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:wlan5g",
> ++		.gpio		= ARCHER_C25_74HC_GPIO_LED_WLAN5,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:lan1",
> ++		.gpio		= ARCHER_C25_74HC_GPIO_LED_LAN1,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:lan2",
> ++		.gpio		= ARCHER_C25_74HC_GPIO_LED_LAN2,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:lan3",
> ++		.gpio		= ARCHER_C25_74HC_GPIO_LED_LAN3,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:lan4",
> ++		.gpio		= ARCHER_C25_74HC_GPIO_LED_LAN4,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:wan",
> ++		.gpio		=
> ARCHER_C25_74HC_GPIO_LED_WAN_GREEN,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:amber:wan",
> ++		.gpio		=
> ARCHER_C25_74HC_GPIO_LED_WAN_AMBER,
> ++		.active_low	= 1,
> ++	},
> ++};
> ++
> ++static struct gpio_keys_button archer_c25_v1_gpio_keys[] __initdata 
> ++=
{
> ++	{
> ++		.desc			= "Reset button",
> ++		.type			= EV_KEY,
> ++		.code			= KEY_RESTART,
> ++		.debounce_interval	=
> ARCHER_C25_V1_KEYS_DEBOUNCE_INTERVAL,
> ++		.gpio			= ARCHER_C25_V1_GPIO_BTN_RESET,
> ++		.active_low		= 1,
> ++	}, {
> ++		.desc			= "RFKILL button",
> ++		.type			= EV_KEY,
> ++		.code			= KEY_RFKILL,
> ++		.debounce_interval	=
> ARCHER_C25_V1_KEYS_DEBOUNCE_INTERVAL,
> ++		.gpio			=
> ARCHER_C25_V1_GPIO_BTN_RFKILL,
> ++		.active_low		= 1,
> ++	},
> ++};
> ++
> ++static void __init archer_c25_v1_setup(void) {
> ++	u8 *mac = (u8 *) KSEG1ADDR(0x1f7e0008);
> ++	u8 *art = (u8 *) KSEG1ADDR(0x1f7f0000);
> ++
> ++	ath79_register_m25p80(NULL);
> ++
> ++	spi_register_board_info(archer_c25_v1_spi_info,
> ++				ARRAY_SIZE(archer_c25_v1_spi_info));
> ++
> ++	platform_device_register(&archer_c25_v1_spi_device);
> ++
> ++	gpio_request_one(ARCHER_C25_GPIO_SHIFT_OE,
> ++			 GPIOF_OUT_INIT_LOW |
> GPIOF_EXPORT_DIR_FIXED,
> ++			 "LED control");
> ++
> ++	gpio_request_one(ARCHER_C25_GPIO_SHIFT_SRCLR,
> ++			 GPIOF_OUT_INIT_HIGH |
> GPIOF_EXPORT_DIR_FIXED,
> ++			 "LED reset");
> ++
> ++	ath79_register_leds_gpio(-1,
> ARRAY_SIZE(archer_c25_v1_leds_gpio),
> ++				 archer_c25_v1_leds_gpio);
> ++
> ++	ath79_register_gpio_keys_polled(-1,
> ARCHER_C25_V1_KEYS_POLL_INTERVAL,
> ++
> ARRAY_SIZE(archer_c25_v1_gpio_keys),
> ++					archer_c25_v1_gpio_keys);
> ++
> ++	ath79_register_mdio(0, 0x0);
> ++	ath79_register_mdio(1, 0x0);
> ++
> ++	ath79_init_mac(ath79_eth0_data.mac_addr, mac, 0);
> ++	ath79_init_mac(ath79_eth1_data.mac_addr, mac, 1);
> ++
> ++	/* WAN port */
> ++	ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
> ++	ath79_eth0_data.speed = SPEED_100;
> ++	ath79_eth0_data.duplex = DUPLEX_FULL;
> ++	ath79_eth0_data.phy_mask = BIT(4);
> ++	ath79_register_eth(0);
> ++
> ++	/* LAN ports */
> ++	ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII;
> ++	ath79_eth1_data.speed = SPEED_1000;
> ++	ath79_eth1_data.duplex = DUPLEX_FULL;
> ++	ath79_switch_data.phy_poll_mask |= BIT(4);
> ++	ath79_switch_data.phy4_mii_en = 1;
> ++	ath79_register_eth(1);
> ++
> ++	ath79_register_wmac(art +
> ARCHER_C25_V1_WMAC_CALDATA_OFFSET, mac);
> ++	ap91_pci_init(NULL, NULL);
> ++}
> ++
> ++MIPS_MACHINE(ATH79_MACH_ARCHER_C25_V1, "ARCHER-C25-V1", "TP-
> LINK
> ++Archer
> C25 v1",
> ++	     archer_c25_v1_setup);
> +diff --git a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> +index b9a8e3e..53f0d1c 100644
> +--- a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> ++++ b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> +@@ -39,6 +39,7 @@ enum ath79_mach_type {
> + 	ATH79_MACH_AP152,			/* Atheros AP152 reference
> board */
> + 	ATH79_MACH_AP90Q,			/* YunCore AP90Q */
> + 	ATH79_MACH_AP96,			/* Atheros AP96 */
> ++	ATH79_MACH_ARCHER_C25_V1,		/* TP-LINK Archer C25
> V1
> board */
> + 	ATH79_MACH_ARCHER_C5,			/* TP-LINK Archer C5
> board
> */
> + 	ATH79_MACH_ARCHER_C7,			/* TP-LINK Archer C7
> board
> */
> + 	ATH79_MACH_ARCHER_C7_V2,		/* TP-LINK Archer C7
> V2
> board */
> +diff --git a/target/linux/ar71xx/image/tp-link.mk
> b/target/linux/ar71xx/image/tp-link.mk
> +index 1c88f43..f70c12c 100644
> +--- a/target/linux/ar71xx/image/tp-link.mk
> ++++ b/target/linux/ar71xx/image/tp-link.mk
> +@@ -45,6 +45,14 @@ define Build/mktplinkfw-kernel
> + 	@mv $@.new $@
> + endef
> +
> ++define Build/uImageArcher
> ++	mkimage -A $(LINUX_KARCH) \
> ++			-O linux -T kernel \
> ++			-C $(1) -a $(KERNEL_LOADADDR) -e $(if
> $(KERNEL_ENTRY),$(KERNEL_ENTRY),$(KERNEL_LOADADDR)) \
> ++			-n '$(call toupper,$(LINUX_KARCH)) LEDE
> Linux-$(LINUX_VERSION)' -d $@ $@.new
> ++	@mv $@.new $@
> ++endef
> ++
> + define Device/tplink
> +   TPLINK_HWREV := 0x1
> +   TPLINK_HEADER_VERSION := 1
> +@@ -95,6 +103,22 @@ $(Device/tplink)
> +   IMAGE_SIZE := 15872k
> + endef
> +
> ++define Device/archer-c25-v1
> ++  DEVICE_TITLE := TP-LINK Archer C25 v1
> ++  DEVICE_PACKAGES := kmod-ath10k ath10k-firmware-qca9887
> ++  BOARDNAME := ARCHER-C25-V1
> ++  TPLINK_BOARD_NAME := ARCHER-C25-V1
> ++  DEVICE_PROFILE := ARCHERC25V1
> ++  IMAGE_SIZE := 7808k
> ++  LOADER_TYPE := elf
> ++  KERNEL := kernel-bin | patch-cmdline | lzma | uImageArcher lzma
> ++  IMAGES := sysupgrade.bin factory.bin
> ++  IMAGE/sysupgrade.bin := append-rootfs | tplink-safeloader 
> ++sysupgrade
> ++  IMAGE/factory.bin := append-rootfs | tplink-safeloader factory
> ++  MTDPARTS :=
>
spi0.0:128k(factory-uboot)ro,64k(u-boot)ro,1536k(kernel),6272k(rootfs),128
> k(config)ro,64k(art)ro,7808k@0x30000(firmware)
> ++endef
> ++TARGET_DEVICES += archer-c25-v1
> ++
> + define Device/cpe510-520
> +   DEVICE_TITLE := TP-LINK CPE510/520
> +   DEVICE_PACKAGES := rssileds
> +diff --git a/target/linux/ar71xx/mikrotik/config-default
> b/target/linux/ar71xx/mikrotik/config-default
> +index 44ea327..3f11c23 100644
> +--- a/target/linux/ar71xx/mikrotik/config-default
> ++++ b/target/linux/ar71xx/mikrotik/config-default
> +@@ -15,6 +15,7 @@
> + # CONFIG_ATH79_MACH_AP152 is not set  # CONFIG_ATH79_MACH_AP90Q is 
> +not set  # CONFIG_ATH79_MACH_AP96 is not set
> ++# CONFIG_ATH79_MACH_ARCHER_C25_V1 is not set
> + # CONFIG_ATH79_MACH_ARCHER_C7 is not set  # 
> +CONFIG_ATH79_MACH_ARDUINO_YUN is not set  #
> CONFIG_ATH79_MACH_AW_NR580
> +is not set diff --git a/target/linux/ar71xx/nand/config-default
> b/target/linux/ar71xx/nand/config-default
> +index 515266b..6357531 100644
> +--- a/target/linux/ar71xx/nand/config-default
> ++++ b/target/linux/ar71xx/nand/config-default
> +@@ -8,6 +8,7 @@
> + # CONFIG_ATH79_MACH_AP136 is not set  # CONFIG_ATH79_MACH_AP147 is 
> +not set  # CONFIG_ATH79_MACH_AP96 is not set
> ++# CONFIG_ATH79_MACH_ARCHER_C25_V1 is not set
> + # CONFIG_ATH79_MACH_ARCHER_C7 is not set  #
> CONFIG_ATH79_MACH_AW_NR580
> +is not set  # CONFIG_ATH79_MACH_CAP324 is not set
> +--
> +2.1.4
> +
> diff --git
> a/build_patches/openwrt/0007-firmware-utils-tplink-safeloader-add-TP-
> Link-
> Archer-.patch
> b/build_patches/openwrt/0007-firmware-utils-tplink-safeloader-add-TP-
> Link-
> Archer-.patch
> new file mode 100644
> index 0000000..861ccfd
> --- /dev/null
> +++
> b/build_patches/openwrt/0007-firmware-utils-tplink-safeloader-add-TP-
> Link-
> Archer-.patch
> @@ -0,0 +1,112 @@
> +From ae91fb7f8cef0fbd9b0ee707ce577ac9c5cdf2f2 Mon Sep 17 00:00:00
> 2001
> +From: Ludwig Thomeczek <ledesrc@wxorx.net>
> +Date: Sat, 13 May 2017 11:40:48 +0200
> +Subject: [PATCH 7/7] firmware-utils: tplink-safeloader: add TP-Link
> Archer C25
> + v1
> +
> +This adds the necessary firmware layout definitions for the Archer C25.
> +It has an addtional partition containing some static data
> +("extra-para") without which no factory flash is possible, therefore
> +put_data() has been added.
> +
> +Signed-off-by: Ludwig Thomeczek <ledesrc@wxorx.net> [Rebased on 
> +v17.01.2]
> +Signed-off-by: Tim Niemeyer <tim@tnx-x.org>
> +---
> + tools/firmware-utils/src/tplink-safeloader.c | 59
> +++++++++++++++++++++++++++-
> + 1 file changed, 58 insertions(+), 1 deletion(-)
> +
> +diff --git a/tools/firmware-utils/src/tplink-safeloader.c
> b/tools/firmware-utils/src/tplink-safeloader.c
> +index 688cdac..2468426 100644
> +--- a/tools/firmware-utils/src/tplink-safeloader.c
> ++++ b/tools/firmware-utils/src/tplink-safeloader.c
> +@@ -299,6 +299,48 @@ static struct device_info boards[] = {
> + 		.last_sysupgrade_partition = "file-system"
> + 	},
> +
> ++	/** Firmware layout for the C25v1 */
> ++	{
> ++		.id = "ARCHER-C25-V1",
> ++		.support_list =
> ++			"SupportList:\n"
> ++
> "{product_name:ArcherC25,product_ver:1.0.0,special_id:00000000}\n"
> ++
> "{product_name:ArcherC25,product_ver:1.0.0,special_id:55530000}\n"
> ++
> "{product_name:ArcherC25,product_ver:1.0.0,special_id:45550000}\n",
> ++		.support_trail = '\x00',
> ++		.soft_ver = "soft_ver:1.0.0\n",
> ++
> ++		/**
> ++		    We use a bigger os-image partition than the stock
> images (and thus
> ++		    smaller file-system), as our kernel doesn't fit in the
> stock firmware's
> ++		    1MB os-image.
> ++		*/
> ++		.partitions = {
> ++			{"factory-boot", 0x00000, 0x20000},
> ++			{"fs-uboot", 0x20000, 0x10000},
> ++			{"os-image", 0x30000, 0x180000},	/* Stock:
> base 0x30000 size 0x100000 */
> ++			{"file-system", 0x1b0000, 0x620000},	/* Stock:
> base 0x130000 size 0x6a0000 */
> ++			{"user-config", 0x7d0000, 0x04000},
> ++			{"default-mac", 0x7e0000, 0x00100},
> ++			{"device-id", 0x7e0100, 0x00100},
> ++			{"extra-para", 0x7e0200, 0x00100},
> ++			{"pin", 0x7e0300, 0x00100},
> ++			{"support-list", 0x7e0400, 0x00400},
> ++			{"soft-version", 0x7e0800, 0x00400},
> ++			{"product-info", 0x7e0c00, 0x01400},
> ++			{"partition-table", 0x7e2000, 0x01000},
> ++			{"profile", 0x7e3000, 0x01000},
> ++			{"default-config", 0x7e4000, 0x04000},
> ++			{"merge-config", 0x7ec000, 0x02000},
> ++			{"qos-db", 0x7ee000, 0x02000},
> ++			{"radio", 0x7f0000, 0x10000},
> ++			{NULL, 0, 0}
> ++		},
> ++
> ++		.first_sysupgrade_partition = "os-image",
> ++		.last_sysupgrade_partition = "file-system",
> ++	},
> ++
> + 	/** Firmware layout for the C5 */
> + 	{
> + 		.id = "ARCHER-C5-V2",
> +@@ -643,6 +685,15 @@ static struct image_partition_entry 
> +read_file(const
> char *part_name, const char
> + 	return entry;
> + }
> +
> ++/** Creates a new image partition from arbitrary data */ static 
> ++struct image_partition_entry put_data(const char *part_name,
> const char *datain, size_t len) {
> ++
> ++	struct image_partition_entry entry =
> alloc_image_partition(part_name, len);
> ++
> ++	memcpy(entry.data, datain, len);
> ++
> ++	return entry;
> ++}
> +
> + /**
> +    Copies a list of image partitions into an image buffer and 
> + generates
> the image partition table while doing so
> +@@ -824,7 +875,8 @@ static void build_image(const char *output,
> + 		bool add_jffs2_eof,
> + 		bool sysupgrade,
> + 		const struct device_info *info) {
> +-	struct image_partition_entry parts[6] = {};
> ++
> ++	struct image_partition_entry parts[7] = {};
> +
> + 	parts[0] = make_partition_table(info->partitions);
> + 	if (info->soft_ver)
> +@@ -836,6 +888,11 @@ static void build_image(const char *output,
> + 	parts[3] = read_file("os-image", kernel_image, false);
> + 	parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof);
> +
> ++	if (strcasecmp(info->id, "ARCHER-C25-V1") == 0) {
> ++		const char mdat[11] = {0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
> 0x00, 0x00, 0x01, 0x00, 0x00};
> ++		parts[5] = put_data("extra-para", mdat, 11);
> ++	}
> ++
> + 	size_t len;
> + 	void *image;
> + 	if (sysupgrade)
> +--
> +2.1.4
> +
> diff --git a/src/packages/fff/fff-network/Makefile
> b/src/packages/fff/fff-network/Makefile
> index fee3f98..d34016c 100644
> --- a/src/packages/fff/fff-network/Makefile
> +++ b/src/packages/fff/fff-network/Makefile
> @@ -1,7 +1,7 @@
>  include $(TOPDIR)/rules.mk
>
>  PKG_NAME:=fff-network
> -PKG_VERSION:=0.0.6
> +PKG_VERSION:=0.0.7
>  PKG_RELEASE:=1
>
>  PKG_BUILD_DIR:=$(BUILD_DIR)/fff-network
> diff --git a/src/packages/fff/fff-network/ar71xx/network.archer-c25-v1
> b/src/packages/fff/fff-network/ar71xx/network.archer-c25-v1
> new file mode 100644
> index 0000000..e524545
> --- /dev/null
> +++ b/src/packages/fff/fff-network/ar71xx/network.archer-c25-v1
> @@ -0,0 +1,8 @@
> +WANDEV=eth0
> +SWITCHDEV=eth1
> +CLIENT_PORTS="1 2 0t"
> +WAN_PORTS=""
> +BATMAN_PORTS="3 4 0t"
> +
> +ETHMESHMAC=eth1
> +ROUTERMAC=eth0
> --
> 2.1.4
>
> --
> franken-dev mailing list
> franken-dev@freifunk.net
> http://lists.freifunk.net/mailman/listinfo/franken-dev-freifunk.net

--
franken-dev mailing list
franken-dev@freifunk.net
http://lists.freifunk.net/mailman/listinfo/franken-dev-freifunk.net
Tim Niemeyer Aug. 20, 2017, 11:59 a.m.
Und applied

Tim

Am Samstag, den 08.07.2017, 13:00 +0200 schrieb Tim Niemeyer:
> Signed-off-by: Tim Niemeyer <tim@tn-x.org>
> ---
> 
> Changes in v2:
> - Added kernel config for LEDs
> - Changed patch format
> 
>  bsp/ar71xx/.config                                 |   3 +
>  bsp/board_ar71xx.bsp                               |   1 +
>  ...ils-tplink-safeloader-support-strings-as-.patch | 162 +++++++
>  ...1xx-add-support-for-TP-Link-Archer-C25-v1.patch | 499
> +++++++++++++++++++++
>  ...ils-tplink-safeloader-add-TP-Link-Archer-.patch | 112 +++++
>  src/packages/fff/fff-network/Makefile              |   2 +-
>  .../fff/fff-network/ar71xx/network.archer-c25-v1   |   8 +
>  7 files changed, 786 insertions(+), 1 deletion(-)
>  create mode 100644 build_patches/openwrt/0005-firmware-utils-tplink-
> safeloader-support-strings-as-.patch
>  create mode 100644 build_patches/openwrt/0006-ar71xx-add-support-
> for-TP-Link-Archer-C25-v1.patch
>  create mode 100644 build_patches/openwrt/0007-firmware-utils-tplink-
> safeloader-add-TP-Link-Archer-.patch
>  create mode 100644 src/packages/fff/fff-
> network/ar71xx/network.archer-c25-v1
> 
> diff --git a/bsp/ar71xx/.config b/bsp/ar71xx/.config
> index 43d063c..b407f7d 100644
> --- a/bsp/ar71xx/.config
> +++ b/bsp/ar71xx/.config
> @@ -6,6 +6,8 @@ CONFIG_TARGET_ar71xx_generic=y
>  CONFIG_TARGET_MULTI_PROFILE=y
>  CONFIG_TARGET_DEVICE_ar71xx_generic_DEVICE_gl-ar150=y
>  CONFIG_TARGET_DEVICE_PACKAGES_ar71xx_generic_DEVICE_gl-ar150=""
> +CONFIG_TARGET_DEVICE_ar71xx_generic_DEVICE_archer-c25-v1=y
> +CONFIG_TARGET_DEVICE_PACKAGES_ar71xx_generic_DEVICE_archer-c25-v1="-
> kmod-ath10k kmod-ath10k-ct -ath10k-firmware-qca9887 ath10k-firmware-
> qca9887-ct"
>  CONFIG_TARGET_DEVICE_ar71xx_generic_DEVICE_archer-c7-v2=y
>  CONFIG_TARGET_DEVICE_PACKAGES_ar71xx_generic_DEVICE_archer-c7-v2="-
> kmod-ath10k kmod-ath10k-ct -ath10k-firmware-qca988x ath10k-firmware-
> qca988x-ct"
>  CONFIG_TARGET_DEVICE_ar71xx_generic_DEVICE_cpe210-220=y
> @@ -83,6 +85,7 @@ CONFIG_CLEAN_IPKG=y
>  # CONFIG_KERNEL_DEBUG_INFO is not set
>  # CONFIG_KERNEL_DEBUG_KERNEL is not set
>  # CONFIG_PACKAGE_ALFRED_VIS is not set
> +CONFIG_PACKAGE_ath10k-firmware-qca9887-ct=m
>  CONFIG_PACKAGE_ath10k-firmware-qca988x-ct=m
>  CONFIG_PACKAGE_kmod-ath10k-ct=m
>  CONFIG_PACKAGE_kmod-hwmon-core=m
> diff --git a/bsp/board_ar71xx.bsp b/bsp/board_ar71xx.bsp
> index 6c541cc..1137b0d 100644
> --- a/bsp/board_ar71xx.bsp
> +++ b/bsp/board_ar71xx.bsp
> @@ -31,4 +31,5 @@ images=("lede-ar71xx-generic-cpe210-220-squashfs-
> sysupgrade.bin"
>          "lede-ar71xx-generic-tl-wdr4300-v1-squashfs-sysupgrade.bin"
>          "lede-ar71xx-generic-tl-wdr4310-v1-squashfs-sysupgrade.bin"
>          "lede-ar71xx-generic-archer-c7-v2-squashfs-sysupgrade.bin"
> +        "lede-ar71xx-generic-archer-c25-v1-squashfs-sysupgrade.bin"
>          )
> diff --git a/build_patches/openwrt/0005-firmware-utils-tplink-
> safeloader-support-strings-as-.patch b/build_patches/openwrt/0005-
> firmware-utils-tplink-safeloader-support-strings-as-.patch
> new file mode 100644
> index 0000000..289322e
> --- /dev/null
> +++ b/build_patches/openwrt/0005-firmware-utils-tplink-safeloader-
> support-strings-as-.patch
> @@ -0,0 +1,162 @@
> +From e9ef329106fbf7e71718e73aee8b48315dd22a18 Mon Sep 17 00:00:00
> 2001
> +From: Jan Niehusmann <jan@gondor.com>
> +Date: Fri, 19 May 2017 09:42:24 +0200
> +Subject: [PATCH 5/7] firmware-utils: tplink-safeloader: support
> strings as
> + soft_version
> +
> +Some TP-Link routers (C25, C59, C60) contain a version string
> instead
> +of a binary structure in the soft_version partition.
> +
> +Flashing LEDE from the original firmware's GUI, this version string
> +taken from the soft_ver partition of the firmware image is written
> to
> +the router's config partition.
> +
> +When using tftp recovery to go back to the original Archer C25
> firmware,
> +a version check compares that version to the version of the firmware
> to
> +be flashed.
> +
> +Without proper contents in the config partition, reverting to the
> +original firmware fails.
> +
> +Therefore, write the string "soft_ver:1.0.0\n" to that soft_ver
> +partition.
> +
> +Signed-off-by: Jan Niehusmann <jan@gondor.com>
> +[Rebased on v17.01.2]
> +Signed-off-by: Tim Niemeyer <tim@tnx-x.org>
> +---
> + tools/firmware-utils/src/tplink-safeloader.c | 34
> +++++++++++++++++++++++++++-
> + 1 file changed, 33 insertions(+), 1 deletion(-)
> +
> +diff --git a/tools/firmware-utils/src/tplink-safeloader.c
> b/tools/firmware-utils/src/tplink-safeloader.c
> +index 4e3d205..688cdac 100644
> +--- a/tools/firmware-utils/src/tplink-safeloader.c
> ++++ b/tools/firmware-utils/src/tplink-safeloader.c
> +@@ -75,6 +75,7 @@ struct device_info {
> + 	const char *vendor;
> + 	const char *support_list;
> + 	char support_trail;
> ++	const char *soft_ver;
> + 	const struct flash_partition_entry
> partitions[MAX_PARTITIONS+1];
> + 	const char *first_sysupgrade_partition;
> + 	const char *last_sysupgrade_partition;
> +@@ -130,6 +131,7 @@ static struct device_info boards[] = {
> + 			"CPE220(TP-LINK|US|N300-2):1.1\r\n"
> + 			"CPE220(TP-LINK|EU|N300-2):1.1\r\n",
> + 		.support_trail = '\xff',
> ++		.soft_ver = NULL,
> + 
> + 		.partitions = {
> + 			{"fs-uboot", 0x00000, 0x20000},
> +@@ -167,6 +169,7 @@ static struct device_info boards[] = {
> + 			"CPE520(TP-LINK|US|N300-5):1.1\r\n"
> + 			"CPE520(TP-LINK|EU|N300-5):1.1\r\n",
> + 		.support_trail = '\xff',
> ++		.soft_ver = NULL,
> + 
> + 		.partitions = {
> + 			{"fs-uboot", 0x00000, 0x20000},
> +@@ -198,6 +201,7 @@ static struct device_info boards[] = {
> + 			"WBS210(TP-LINK|US|N300-2):1.20\r\n"
> + 			"WBS210(TP-LINK|EU|N300-2):1.20\r\n",
> + 		.support_trail = '\xff',
> ++		.soft_ver = NULL,
> + 
> + 		.partitions = {
> + 			{"fs-uboot", 0x00000, 0x20000},
> +@@ -229,6 +233,7 @@ static struct device_info boards[] = {
> + 			"WBS510(TP-LINK|US|N300-5):1.20\r\n"
> + 			"WBS510(TP-LINK|EU|N300-5):1.20\r\n",
> + 		.support_trail = '\xff',
> ++		.soft_ver = NULL,
> + 
> + 		.partitions = {
> + 			{"fs-uboot", 0x00000, 0x20000},
> +@@ -259,6 +264,7 @@ static struct device_info boards[] = {
> + 			"SupportList:\r\n"
> + 			"{product_name:Archer
> C2600,product_ver:1.0.0,special_id:00000000}\r\n",
> + 		.support_trail = '\x00',
> ++		.soft_ver = NULL,
> + 
> + 		.partitions = {
> + 			{"SBL1", 0x00000, 0x20000},
> +@@ -303,6 +309,7 @@ static struct device_info boards[] = {
> + 			"product_ver:2.0.0,"
> + 			"special_id:00000000}\r\n",
> + 		.support_trail = '\x00',
> ++		.soft_ver = NULL,
> + 
> + 		.partitions = {
> + 			{"fs-uboot", 0x00000, 0x40000},
> +@@ -337,6 +344,7 @@ static struct device_info boards[] = {
> + 			"product_ver:1.0.0,"
> + 			"special_id:00000000}\n",
> + 		.support_trail = '\x00',
> ++		.soft_ver = NULL,
> + 
> + 		.partitions = {
> + 			{"fs-uboot", 0x00000, 0x40000},
> +@@ -369,6 +377,7 @@ static struct device_info boards[] = {
> + 			"SupportList:\r\n"
> + 			"EAP120(TP-LINK|UN|N300-2):1.0\r\n",
> + 		.support_trail = '\xff',
> ++		.soft_ver = NULL,
> + 
> + 		.partitions = {
> + 			{"fs-uboot", 0x00000, 0x20000},
> +@@ -398,6 +407,7 @@ static struct device_info boards[] = {
> + 			"SupportList:\n"
> + 			"{product_name:TL-
> WR1043ND,product_ver:4.0.0,special_id:45550000}\n",
> + 		.support_trail = '\x00',
> ++		.soft_ver = NULL,
> + 
> + 		/**
> + 		    We use a bigger os-image partition than the
> stock images (and thus
> +@@ -441,6 +451,7 @@ static struct device_info boards[] = {
> + 			"{product_name:RE450,product_ver:1.0.0,spec
> ial_id:4B520000}\r\n"
> + 			"{product_name:RE450,product_ver:1.0.0,spec
> ial_id:55534100}\r\n",
> + 		.support_trail = '\x00',
> ++		.soft_ver = NULL,
> + 
> + 		/**
> + 		   The flash partition table for RE450;
> +@@ -569,6 +580,23 @@ static struct image_partition_entry
> make_soft_version(uint32_t rev) {
> + 	return entry;
> + }
> + 
> ++static struct image_partition_entry
> make_soft_version_from_string(const char *soft_ver) {
> ++	/** String length _including_ the terminating zero byte */
> ++	uint32_t ver_len = strlen(soft_ver) + 1;
> ++	/** Partition contains 64 bit header, the version string,
> and one additional null byte */
> ++	size_t partition_len = 2*sizeof(uint32_t) + ver_len + 1;
> ++	struct image_partition_entry entry =
> alloc_image_partition("soft-version", partition_len);
> ++
> ++	uint32_t *len = (uint32_t *)entry.data;
> ++	len[0] = htonl(ver_len);
> ++	len[1] = 0;
> ++	memcpy(&len[2], soft_ver, ver_len);
> ++
> ++	entry.data[partition_len - 1] = 0;
> ++
> ++	return entry;
> ++}
> ++
> + /** Generates the support-list partition */
> + static struct image_partition_entry make_support_list(const struct
> device_info *info) {
> + 	size_t len = strlen(info->support_list);
> +@@ -799,7 +827,11 @@ static void build_image(const char *output,
> + 	struct image_partition_entry parts[6] = {};
> + 
> + 	parts[0] = make_partition_table(info->partitions);
> +-	parts[1] = make_soft_version(rev);
> ++	if (info->soft_ver)
> ++		parts[1] = make_soft_version_from_string(info-
> >soft_ver);
> ++	else
> ++		parts[1] = make_soft_version(rev);
> ++
> + 	parts[2] = make_support_list(info);
> + 	parts[3] = read_file("os-image", kernel_image, false);
> + 	parts[4] = read_file("file-system", rootfs_image,
> add_jffs2_eof);
> +-- 
> +2.1.4
> +
> diff --git a/build_patches/openwrt/0006-ar71xx-add-support-for-TP-
> Link-Archer-C25-v1.patch b/build_patches/openwrt/0006-ar71xx-add-
> support-for-TP-Link-Archer-C25-v1.patch
> new file mode 100644
> index 0000000..aa0f9ce
> --- /dev/null
> +++ b/build_patches/openwrt/0006-ar71xx-add-support-for-TP-Link-
> Archer-C25-v1.patch
> @@ -0,0 +1,499 @@
> +From a5290bd7279f0aa4a7129ce103fec154239ddd86 Mon Sep 17 00:00:00
> 2001
> +From: Ludwig Thomeczek <ledesrc@wxorx.net>
> +Date: Sat, 22 Apr 2017 18:21:47 +0200
> +Subject: [PATCH 6/7] ar71xx: add support for TP-Link Archer C25 v1
> +
> +The TP-Link Archer C25 is a low-cost dual-band router.
> +
> +Specification:
> +
> +- CPU: Atheros QCA9561 775 MHz
> +- RAM: 64 MB
> +- Flash: 8 MB
> +- Wifi: 3x3 2.4 GHz (integrated), 1x1 5 GHz QCA9887
> +- NET: 5x 10/100 Mbps Ethernet
> +
> +Some LEDs are controlled by an additional 74HC595 chip.
> +
> +Signed-off-by: Ludwig Thomeczek <ledesrc@wxorx.net>
> +[minor code style fixes, boards alphabetical order fixes,
> +reworked commit message]
> +Signed-off-by: Piotr Dymacz <pepe2k@gmail.com>
> +[Rebased on v17.01.2]
> +Signed-off-by: Tim Niemeyer <tim@tnx-x.org>
> +---
> + target/linux/ar71xx/base-files/etc/board.d/01_leds |   9 +
> + .../linux/ar71xx/base-files/etc/board.d/02_network |   1 +
> + target/linux/ar71xx/base-files/etc/diag.sh         |   1 +
> + .../etc/hotplug.d/firmware/11-ath10k-caldata       |   1 +
> + target/linux/ar71xx/base-files/lib/ar71xx.sh       |   3 +
> + .../ar71xx/base-files/lib/upgrade/platform.sh      |   1 +
> + target/linux/ar71xx/config-4.4                     |   3 +
> + .../ar71xx/files/arch/mips/ath79/Kconfig.openwrt   |  11 +
> + target/linux/ar71xx/files/arch/mips/ath79/Makefile |   1 +
> + .../files/arch/mips/ath79/mach-archer-c25-v1.c     | 227
> +++++++++++++++++++++
> + .../linux/ar71xx/files/arch/mips/ath79/machtypes.h |   1 +
> + target/linux/ar71xx/image/tp-link.mk               |  24 +++
> + target/linux/ar71xx/mikrotik/config-default        |   1 +
> + target/linux/ar71xx/nand/config-default            |   1 +
> + 14 files changed, 285 insertions(+)
> + create mode 100644 target/linux/ar71xx/files/arch/mips/ath79/mach-
> archer-c25-v1.c
> +
> +diff --git a/target/linux/ar71xx/base-files/etc/board.d/01_leds
> b/target/linux/ar71xx/base-files/etc/board.d/01_leds
> +index 0279dfc..3aa2bfb 100755
> +--- a/target/linux/ar71xx/base-files/etc/board.d/01_leds
> ++++ b/target/linux/ar71xx/base-files/etc/board.d/01_leds
> +@@ -49,6 +49,15 @@ antrouter-r1)
> + 	ucidef_set_led_wlan "wlan" "WLAN" "$board:green:wlan"
> "phy0tpt"
> + 	ucidef_set_led_default "btc" "BTC" "$board:green:btc" "0"
> + 	;;
> ++archer-c25-v1)
> ++	ucidef_set_led_netdev "wan" "WAN" "$board:green:wan" "eth0"
> ++	ucidef_set_led_wlan "wlan" "WLAN" "$board:green:wlan2g"
> "phy1tpt"
> ++	ucidef_set_led_wlan "wlan5g" "WLAN5G" "$board:green:wlan5g"
> "phy0tpt"
> ++	ucidef_set_led_switch "lan1" "LAN1" "$board:green:lan1"
> "switch0" "0x10"
> ++	ucidef_set_led_switch "lan2" "LAN2" "$board:green:lan2"
> "switch0" "0x08"
> ++	ucidef_set_led_switch "lan3" "LAN3" "$board:green:lan3"
> "switch0" "0x04"
> ++	ucidef_set_led_switch "lan4" "LAN4" "$board:green:lan4"
> "switch0" "0x02"
> ++	;;
> + arduino-yun)
> + 	ucidef_set_led_wlan "wlan" "WLAN" "arduino:blue:wlan"
> "phy0tpt"
> + 	ucidef_set_led_usbdev "usb" "USB" "arduino:white:usb" "1-
> 1.1"
> +diff --git a/target/linux/ar71xx/base-files/etc/board.d/02_network
> b/target/linux/ar71xx/base-files/etc/board.d/02_network
> +index c8c7827..4404e80 100755
> +--- a/target/linux/ar71xx/base-files/etc/board.d/02_network
> ++++ b/target/linux/ar71xx/base-files/etc/board.d/02_network
> +@@ -122,6 +122,7 @@ ar71xx_setup_interfaces()
> + 	a60|\
> + 	alfa-ap96|\
> + 	alfa-nx|\
> ++	archer-c25-v1|\
> + 	dr344|\
> + 	gl-ar150|\
> + 	gl-ar300m|\
> +diff --git a/target/linux/ar71xx/base-files/etc/diag.sh
> b/target/linux/ar71xx/base-files/etc/diag.sh
> +index 7b8aac8..cf6278c 100644
> +--- a/target/linux/ar71xx/base-files/etc/diag.sh
> ++++ b/target/linux/ar71xx/base-files/etc/diag.sh
> +@@ -47,6 +47,7 @@ get_status_led() {
> + 	ap135-020)
> + 		status_led="ap135:green:status"
> + 		;;
> ++	archer-c25-v1|\
> + 	mr12|\
> + 	mr16|\
> + 	nbg6616|\
> +diff --git a/target/linux/ar71xx/base-
> files/etc/hotplug.d/firmware/11-ath10k-caldata
> b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-
> caldata
> +index b3e23c9..68f90de 100644
> +--- a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-
> ath10k-caldata
> ++++ b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-
> ath10k-caldata
> +@@ -92,6 +92,7 @@ case "$FIRMWARE" in
> + 		ath10kcal_extract "art" 20480 2116
> + 		ath10kcal_patch_mac $(macaddr_add $(cat
> /sys/class/net/eth0/address) -2)
> + 		;;
> ++	archer-c25-v1|\
> + 	tl-wdr6500-v2)
> + 		ath10kcal_extract "art" 20480 2116
> + 		ath10kcal_patch_mac $(macaddr_add $(cat
> /sys/class/net/eth1/address) -2)
> +diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh
> b/target/linux/ar71xx/base-files/lib/ar71xx.sh
> +index b035535..0d01c5e 100755
> +--- a/target/linux/ar71xx/base-files/lib/ar71xx.sh
> ++++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh
> +@@ -457,6 +457,9 @@ ar71xx_board_detect() {
> + 	*AP90Q)
> + 		name="ap90q"
> + 		;;
> ++	*"Archer C25 v1")
> ++		name="archer-c25-v1"
> ++		;;
> + 	*"Archer C5")
> + 		name="archer-c5"
> + 		;;
> +diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> +index 580e09a..e2aaceb 100755
> +--- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> ++++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> +@@ -205,6 +205,7 @@ platform_check_image() {
> + 	airrouter|\
> + 	ap132|\
> + 	ap90q|\
> ++	archer-c25-v1|\
> + 	bullet-m|\
> + 	c-55|\
> + 	carambola2|\
> +diff --git a/target/linux/ar71xx/config-4.4
> b/target/linux/ar71xx/config-4.4
> +index ff6bb13..79308e8 100644
> +--- a/target/linux/ar71xx/config-4.4
> ++++ b/target/linux/ar71xx/config-4.4
> +@@ -50,6 +50,7 @@ CONFIG_ATH79_MACH_AP152=y
> + # CONFIG_ATH79_MACH_AP81 is not set
> + CONFIG_ATH79_MACH_AP90Q=y
> + CONFIG_ATH79_MACH_AP96=y
> ++CONFIG_ATH79_MACH_ARCHER_C25_V1=y
> + CONFIG_ATH79_MACH_ARCHER_C7=y
> + CONFIG_ATH79_MACH_ARDUINO_YUN=y
> + CONFIG_ATH79_MACH_AW_NR580=y
> +@@ -269,6 +270,7 @@ CONFIG_GENERIC_SMP_IDLE_THREAD=y
> + CONFIG_GENERIC_TIME_VSYSCALL=y
> + CONFIG_GPIOLIB=y
> + CONFIG_GPIOLIB_IRQCHIP=y
> ++CONFIG_GPIO_74X164=y
> + CONFIG_GPIO_DEVRES=y
> + # CONFIG_GPIO_LATCH is not set
> + CONFIG_GPIO_NXP_74HC153=y
> +@@ -335,6 +337,7 @@ CONFIG_LEDS_NU801=y
> + CONFIG_LIBFDT=y
> + CONFIG_MARVELL_PHY=y
> + CONFIG_MDIO_BITBANG=y
> ++CONFIG_SPI_GPIO=y
> + CONFIG_MDIO_BOARDINFO=y
> + CONFIG_MDIO_GPIO=y
> + CONFIG_MICREL_PHY=y
> +diff --git
> a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> +index 76ba6fa..d49659c 100644
> +--- a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> ++++ b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> +@@ -1224,6 +1224,17 @@ config ATH79_MACH_BSB
> + 	select ATH79_DEV_USB
> + 	select ATH79_DEV_WMAC
> + 
> ++config ATH79_MACH_ARCHER_C25_V1
> ++	bool "TP-LINK Archer C25 v1 support"
> ++	select SOC_QCA956X
> ++	select ATH79_DEV_AP9X_PCI if PCI
> ++	select ATH79_DEV_ETH
> ++	select ATH79_DEV_GPIO_BUTTONS
> ++	select ATH79_DEV_LEDS_GPIO
> ++	select ATH79_DEV_M25P80
> ++	select ATH79_DEV_WMAC
> ++
> ++
> + config ATH79_MACH_ARCHER_C7
> + 	bool "TP-LINK Archer C5/C7/TL-WDR4900 v2 board support"
> + 	select SOC_QCA955X
> +diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Makefile
> b/target/linux/ar71xx/files/arch/mips/ath79/Makefile
> +index c91d03f..fc28716 100644
> +--- a/target/linux/ar71xx/files/arch/mips/ath79/Makefile
> ++++ b/target/linux/ar71xx/files/arch/mips/ath79/Makefile
> +@@ -55,6 +55,7 @@ obj-$(CONFIG_ATH79_MACH_AP147)			
> += mach-ap147.o
> + obj-$(CONFIG_ATH79_MACH_AP152)			+= mach-
> ap152.o
> + obj-$(CONFIG_ATH79_MACH_AP90Q)			+= mach-
> ap90q.o
> + obj-$(CONFIG_ATH79_MACH_AP96)			+= mach-ap96.o
> ++obj-$(CONFIG_ATH79_MACH_ARCHER_C25_V1)		+= mach-
> archer-c25-v1.o
> + obj-$(CONFIG_ATH79_MACH_ARCHER_C7)		+= mach-archer-
> c7.o
> + obj-$(CONFIG_ATH79_MACH_ARDUINO_YUN)		+= mach-
> arduino-yun.o
> + obj-$(CONFIG_ATH79_MACH_AW_NR580)		+= mach-aw-nr580.o
> +diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-
> c25-v1.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-
> v1.c
> +new file mode 100644
> +index 0000000..a0f001c
> +--- /dev/null
> ++++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c
> +@@ -0,0 +1,227 @@
> ++/*
> ++ *  TP-Link Archer C25 v1 board support
> ++ *
> ++ *  Copyright (C) 2017 Ludwig Thomeczek <ledesrc@wxorx.net>
> ++ *  based on mach-archer-c60/C59-v1.c
> ++ *  Copyright (C) 2016 Henryk Heisig <hyniu@o2.pl>
> ++ *
> ++ *  This program is free software; you can redistribute it and/or
> modify it
> ++ *  under the terms of the GNU General Public License version 2 as
> published
> ++ *  by the Free Software Foundation.
> ++ */
> ++#include <linux/platform_device.h>
> ++#include <linux/ath9k_platform.h>
> ++#include <linux/ar8216_platform.h>
> ++#include <asm/mach-ath79/ar71xx_regs.h>
> ++#include <linux/gpio.h>
> ++
> ++#include "common.h"
> ++#include "dev-m25p80.h"
> ++#include "machtypes.h"
> ++#include "pci.h"
> ++#include "dev-ap9x-pci.h"
> ++#include "dev-eth.h"
> ++#include "dev-gpio-buttons.h"
> ++#include "dev-leds-gpio.h"
> ++#include "dev-spi.h"
> ++#include "dev-usb.h"
> ++#include "dev-wmac.h"
> ++#include <linux/spi/spi_gpio.h>
> ++#include <linux/spi/74x164.h>
> ++
> ++#define ARCHER_C25_GPIO_SHIFT_OE	21 /* OE,   Output Enable
> */
> ++#define ARCHER_C25_GPIO_SHIFT_SER	14 /* DS,   Data Serial
> Input */
> ++#define ARCHER_C25_GPIO_SHIFT_SRCLK	15 /* SHCP, Shift Reg
> Clock Input */
> ++#define ARCHER_C25_GPIO_SHIFT_SRCLR	19 /* MR,   Master Reset
> */
> ++#define ARCHER_C25_GPIO_SHIFT_RCLK	16 /* STCP, Storage Reg
> Clock Input */
> ++
> ++#define ARCHER_C25_74HC_GPIO_BASE		QCA956X_GPIO_COUNT
> ++#define ARCHER_C25_74HC_GPIO_LED_WAN_AMBER	27
> ++#define ARCHER_C25_74HC_GPIO_LED_WAN_GREEN	28
> ++#define ARCHER_C25_74HC_GPIO_LED_WLAN2		29
> ++#define ARCHER_C25_74HC_GPIO_LED_WLAN5		30
> ++#define ARCHER_C25_74HC_GPIO_LED_LAN1		23
> ++#define ARCHER_C25_74HC_GPIO_LED_LAN2		24
> ++#define ARCHER_C25_74HC_GPIO_LED_LAN3		25
> ++#define ARCHER_C25_74HC_GPIO_LED_LAN4		26
> ++
> ++#define ARCHER_C25_V1_SSR_BIT_0			0
> ++#define ARCHER_C25_V1_SSR_BIT_1			1
> ++#define ARCHER_C25_V1_SSR_BIT_2			2
> ++#define ARCHER_C25_V1_SSR_BIT_3			3
> ++#define ARCHER_C25_V1_SSR_BIT_4			4
> ++#define ARCHER_C25_V1_SSR_BIT_5			5
> ++#define ARCHER_C25_V1_SSR_BIT_6			6
> ++#define ARCHER_C25_V1_SSR_BIT_7			7
> ++
> ++
> ++#define ARCHER_C25_V1_KEYS_POLL_INTERVAL	20
> ++#define ARCHER_C25_V1_KEYS_DEBOUNCE_INTERVAL	\
> ++					(3 *
> ARCHER_C25_V1_KEYS_POLL_INTERVAL)
> ++
> ++#define ARCHER_C25_V1_GPIO_BTN_RESET		1
> ++#define ARCHER_C25_V1_GPIO_BTN_RFKILL		22
> ++
> ++#define ARCHER_C25_V1_GPIO_LED_POWER		17
> ++#define ARCHER_C25_V1_GPIO_LED_WPS		2
> ++
> ++#define ARCHER_C25_V1_WMAC_CALDATA_OFFSET	0x1000
> ++
> ++static struct spi_gpio_platform_data archer_c25_v1_spi_data = {
> ++	.sck		= ARCHER_C25_GPIO_SHIFT_SRCLK,
> ++	.miso		= SPI_GPIO_NO_MISO,
> ++	.mosi		= ARCHER_C25_GPIO_SHIFT_SER,
> ++	.num_chipselect	= 1,
> ++};
> ++
> ++static u8 archer_c25_v1_ssr_initdata[] __initdata = {
> ++	BIT(ARCHER_C25_V1_SSR_BIT_7) |
> ++	BIT(ARCHER_C25_V1_SSR_BIT_6) |
> ++	BIT(ARCHER_C25_V1_SSR_BIT_5) |
> ++	BIT(ARCHER_C25_V1_SSR_BIT_4) |
> ++	BIT(ARCHER_C25_V1_SSR_BIT_3) |
> ++	BIT(ARCHER_C25_V1_SSR_BIT_2) |
> ++	BIT(ARCHER_C25_V1_SSR_BIT_1)
> ++};
> ++
> ++static struct gen_74x164_chip_platform_data archer_c25_v1_ssr_data
> = {
> ++	.base = ARCHER_C25_74HC_GPIO_BASE,
> ++	.num_registers = ARRAY_SIZE(archer_c25_v1_ssr_initdata),
> ++	.init_data = archer_c25_v1_ssr_initdata,
> ++};
> ++
> ++static struct platform_device archer_c25_v1_spi_device = {
> ++	.name		= "spi_gpio",
> ++	.id		= 1,
> ++	.dev = {
> ++		.platform_data = &archer_c25_v1_spi_data,
> ++	},
> ++};
> ++
> ++static struct spi_board_info archer_c25_v1_spi_info[] = {
> ++	{
> ++		.bus_num		= 1,
> ++		.chip_select		= 0,
> ++		.max_speed_hz		= 10000000,
> ++		.modalias		= "74x164",
> ++		.platform_data		=
> &archer_c25_v1_ssr_data,
> ++		.controller_data	= (void *)
> ARCHER_C25_GPIO_SHIFT_RCLK,
> ++	},
> ++};
> ++
> ++static struct gpio_led archer_c25_v1_leds_gpio[] __initdata = {
> ++	{
> ++		.name		= "archer-c25-v1:green:power",
> ++		.gpio		=
> ARCHER_C25_V1_GPIO_LED_POWER,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:wps",
> ++		.gpio		= ARCHER_C25_V1_GPIO_LED_WPS,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-
> v1:green:wlan2g",
> ++		.gpio		=
> ARCHER_C25_74HC_GPIO_LED_WLAN2,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-
> v1:green:wlan5g",
> ++		.gpio		=
> ARCHER_C25_74HC_GPIO_LED_WLAN5,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:lan1",
> ++		.gpio		=
> ARCHER_C25_74HC_GPIO_LED_LAN1,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:lan2",
> ++		.gpio		=
> ARCHER_C25_74HC_GPIO_LED_LAN2,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:lan3",
> ++		.gpio		=
> ARCHER_C25_74HC_GPIO_LED_LAN3,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:lan4",
> ++		.gpio		=
> ARCHER_C25_74HC_GPIO_LED_LAN4,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:green:wan",
> ++		.gpio		=  ARCHER_C25_74HC_GPIO_LED_WA
> N_GREEN,
> ++		.active_low	= 1,
> ++	}, {
> ++		.name		= "archer-c25-v1:amber:wan",
> ++		.gpio		=  ARCHER_C25_74HC_GPIO_LED_WA
> N_AMBER,
> ++		.active_low	= 1,
> ++	},
> ++};
> ++
> ++static struct gpio_keys_button archer_c25_v1_gpio_keys[] __initdata
> = {
> ++	{
> ++		.desc			= "Reset button",
> ++		.type			= EV_KEY,
> ++		.code			= KEY_RESTART,
> ++		.debounce_interval	=
> ARCHER_C25_V1_KEYS_DEBOUNCE_INTERVAL,
> ++		.gpio			=
> ARCHER_C25_V1_GPIO_BTN_RESET,
> ++		.active_low		= 1,
> ++	}, {
> ++		.desc			= "RFKILL button",
> ++		.type			= EV_KEY,
> ++		.code			= KEY_RFKILL,
> ++		.debounce_interval	=
> ARCHER_C25_V1_KEYS_DEBOUNCE_INTERVAL,
> ++		.gpio			=
> ARCHER_C25_V1_GPIO_BTN_RFKILL,
> ++		.active_low		= 1,
> ++	},
> ++};
> ++
> ++static void __init archer_c25_v1_setup(void)
> ++{
> ++	u8 *mac = (u8 *) KSEG1ADDR(0x1f7e0008);
> ++	u8 *art = (u8 *) KSEG1ADDR(0x1f7f0000);
> ++
> ++	ath79_register_m25p80(NULL);
> ++
> ++	spi_register_board_info(archer_c25_v1_spi_info,
> ++				ARRAY_SIZE(archer_c25_v1_spi_info))
> ;
> ++
> ++	platform_device_register(&archer_c25_v1_spi_device);
> ++
> ++	gpio_request_one(ARCHER_C25_GPIO_SHIFT_OE,
> ++			 GPIOF_OUT_INIT_LOW |
> GPIOF_EXPORT_DIR_FIXED,
> ++			 "LED control");
> ++
> ++	gpio_request_one(ARCHER_C25_GPIO_SHIFT_SRCLR,
> ++			 GPIOF_OUT_INIT_HIGH |
> GPIOF_EXPORT_DIR_FIXED,
> ++			 "LED reset");
> ++
> ++	ath79_register_leds_gpio(-1,
> ARRAY_SIZE(archer_c25_v1_leds_gpio),
> ++				 archer_c25_v1_leds_gpio);
> ++
> ++	ath79_register_gpio_keys_polled(-1,
> ARCHER_C25_V1_KEYS_POLL_INTERVAL,
> ++					ARRAY_SIZE(archer_c25_v1_gp
> io_keys),
> ++					archer_c25_v1_gpio_keys);
> ++
> ++	ath79_register_mdio(0, 0x0);
> ++	ath79_register_mdio(1, 0x0);
> ++
> ++	ath79_init_mac(ath79_eth0_data.mac_addr, mac, 0);
> ++	ath79_init_mac(ath79_eth1_data.mac_addr, mac, 1);
> ++
> ++	/* WAN port */
> ++	ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
> ++	ath79_eth0_data.speed = SPEED_100;
> ++	ath79_eth0_data.duplex = DUPLEX_FULL;
> ++	ath79_eth0_data.phy_mask = BIT(4);
> ++	ath79_register_eth(0);
> ++
> ++	/* LAN ports */
> ++	ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII;
> ++	ath79_eth1_data.speed = SPEED_1000;
> ++	ath79_eth1_data.duplex = DUPLEX_FULL;
> ++	ath79_switch_data.phy_poll_mask |= BIT(4);
> ++	ath79_switch_data.phy4_mii_en = 1;
> ++	ath79_register_eth(1);
> ++
> ++	ath79_register_wmac(art +
> ARCHER_C25_V1_WMAC_CALDATA_OFFSET, mac);
> ++	ap91_pci_init(NULL, NULL);
> ++}
> ++
> ++MIPS_MACHINE(ATH79_MACH_ARCHER_C25_V1, "ARCHER-C25-V1", "TP-LINK
> Archer C25 v1",
> ++	     archer_c25_v1_setup);
> +diff --git a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> +index b9a8e3e..53f0d1c 100644
> +--- a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> ++++ b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> +@@ -39,6 +39,7 @@ enum ath79_mach_type {
> + 	ATH79_MACH_AP152,			/* Atheros AP152
> reference board */
> + 	ATH79_MACH_AP90Q,			/* YunCore AP90Q
> */
> + 	ATH79_MACH_AP96,			/* Atheros AP96 */
> ++	ATH79_MACH_ARCHER_C25_V1,		/* TP-LINK Archer
> C25 V1 board */
> + 	ATH79_MACH_ARCHER_C5,			/* TP-LINK
> Archer C5 board */
> + 	ATH79_MACH_ARCHER_C7,			/* TP-LINK
> Archer C7 board */
> + 	ATH79_MACH_ARCHER_C7_V2,		/* TP-LINK Archer
> C7 V2 board */
> +diff --git a/target/linux/ar71xx/image/tp-link.mk
> b/target/linux/ar71xx/image/tp-link.mk
> +index 1c88f43..f70c12c 100644
> +--- a/target/linux/ar71xx/image/tp-link.mk
> ++++ b/target/linux/ar71xx/image/tp-link.mk
> +@@ -45,6 +45,14 @@ define Build/mktplinkfw-kernel
> + 	@mv $@.new $@
> + endef
> + 
> ++define Build/uImageArcher
> ++	mkimage -A $(LINUX_KARCH) \
> ++			-O linux -T kernel \
> ++			-C $(1) -a $(KERNEL_LOADADDR) -e $(if
> $(KERNEL_ENTRY),$(KERNEL_ENTRY),$(KERNEL_LOADADDR)) \
> ++			-n '$(call toupper,$(LINUX_KARCH)) LEDE
> Linux-$(LINUX_VERSION)' -d $@ $@.new
> ++	@mv $@.new $@
> ++endef
> ++
> + define Device/tplink
> +   TPLINK_HWREV := 0x1
> +   TPLINK_HEADER_VERSION := 1
> +@@ -95,6 +103,22 @@ $(Device/tplink)
> +   IMAGE_SIZE := 15872k
> + endef
> + 
> ++define Device/archer-c25-v1
> ++  DEVICE_TITLE := TP-LINK Archer C25 v1
> ++  DEVICE_PACKAGES := kmod-ath10k ath10k-firmware-qca9887
> ++  BOARDNAME := ARCHER-C25-V1
> ++  TPLINK_BOARD_NAME := ARCHER-C25-V1
> ++  DEVICE_PROFILE := ARCHERC25V1
> ++  IMAGE_SIZE := 7808k
> ++  LOADER_TYPE := elf
> ++  KERNEL := kernel-bin | patch-cmdline | lzma | uImageArcher lzma
> ++  IMAGES := sysupgrade.bin factory.bin
> ++  IMAGE/sysupgrade.bin := append-rootfs | tplink-safeloader
> sysupgrade
> ++  IMAGE/factory.bin := append-rootfs | tplink-safeloader factory
> ++  MTDPARTS := spi0.0:128k(factory-uboot)ro,64k(u-
> boot)ro,1536k(kernel),6272k(rootfs),128k(config)ro,64k(art)ro,7808k@0
> x30000(firmware)
> ++endef
> ++TARGET_DEVICES += archer-c25-v1
> ++
> + define Device/cpe510-520
> +   DEVICE_TITLE := TP-LINK CPE510/520
> +   DEVICE_PACKAGES := rssileds
> +diff --git a/target/linux/ar71xx/mikrotik/config-default
> b/target/linux/ar71xx/mikrotik/config-default
> +index 44ea327..3f11c23 100644
> +--- a/target/linux/ar71xx/mikrotik/config-default
> ++++ b/target/linux/ar71xx/mikrotik/config-default
> +@@ -15,6 +15,7 @@
> + # CONFIG_ATH79_MACH_AP152 is not set
> + # CONFIG_ATH79_MACH_AP90Q is not set
> + # CONFIG_ATH79_MACH_AP96 is not set
> ++# CONFIG_ATH79_MACH_ARCHER_C25_V1 is not set
> + # CONFIG_ATH79_MACH_ARCHER_C7 is not set
> + # CONFIG_ATH79_MACH_ARDUINO_YUN is not set
> + # CONFIG_ATH79_MACH_AW_NR580 is not set
> +diff --git a/target/linux/ar71xx/nand/config-default
> b/target/linux/ar71xx/nand/config-default
> +index 515266b..6357531 100644
> +--- a/target/linux/ar71xx/nand/config-default
> ++++ b/target/linux/ar71xx/nand/config-default
> +@@ -8,6 +8,7 @@
> + # CONFIG_ATH79_MACH_AP136 is not set
> + # CONFIG_ATH79_MACH_AP147 is not set
> + # CONFIG_ATH79_MACH_AP96 is not set
> ++# CONFIG_ATH79_MACH_ARCHER_C25_V1 is not set
> + # CONFIG_ATH79_MACH_ARCHER_C7 is not set
> + # CONFIG_ATH79_MACH_AW_NR580 is not set
> + # CONFIG_ATH79_MACH_CAP324 is not set
> +-- 
> +2.1.4
> +
> diff --git a/build_patches/openwrt/0007-firmware-utils-tplink-
> safeloader-add-TP-Link-Archer-.patch b/build_patches/openwrt/0007-
> firmware-utils-tplink-safeloader-add-TP-Link-Archer-.patch
> new file mode 100644
> index 0000000..861ccfd
> --- /dev/null
> +++ b/build_patches/openwrt/0007-firmware-utils-tplink-safeloader-
> add-TP-Link-Archer-.patch
> @@ -0,0 +1,112 @@
> +From ae91fb7f8cef0fbd9b0ee707ce577ac9c5cdf2f2 Mon Sep 17 00:00:00
> 2001
> +From: Ludwig Thomeczek <ledesrc@wxorx.net>
> +Date: Sat, 13 May 2017 11:40:48 +0200
> +Subject: [PATCH 7/7] firmware-utils: tplink-safeloader: add TP-Link
> Archer C25
> + v1
> +
> +This adds the necessary firmware layout definitions for the Archer
> C25.
> +It has an addtional partition containing some static data ("extra-
> para")
> +without which no factory flash is possible, therefore put_data() has
> been
> +added.
> +
> +Signed-off-by: Ludwig Thomeczek <ledesrc@wxorx.net>
> +[Rebased on v17.01.2]
> +Signed-off-by: Tim Niemeyer <tim@tnx-x.org>
> +---
> + tools/firmware-utils/src/tplink-safeloader.c | 59
> +++++++++++++++++++++++++++-
> + 1 file changed, 58 insertions(+), 1 deletion(-)
> +
> +diff --git a/tools/firmware-utils/src/tplink-safeloader.c
> b/tools/firmware-utils/src/tplink-safeloader.c
> +index 688cdac..2468426 100644
> +--- a/tools/firmware-utils/src/tplink-safeloader.c
> ++++ b/tools/firmware-utils/src/tplink-safeloader.c
> +@@ -299,6 +299,48 @@ static struct device_info boards[] = {
> + 		.last_sysupgrade_partition = "file-system"
> + 	},
> + 
> ++	/** Firmware layout for the C25v1 */
> ++	{
> ++		.id = "ARCHER-C25-V1",
> ++		.support_list =
> ++			"SupportList:\n"
> ++			"{product_name:ArcherC25,product_ver:1.0.0,
> special_id:00000000}\n"
> ++			"{product_name:ArcherC25,product_ver:1.0.0,
> special_id:55530000}\n"
> ++			"{product_name:ArcherC25,product_ver:1.0.0,
> special_id:45550000}\n",
> ++		.support_trail = '\x00',
> ++		.soft_ver = "soft_ver:1.0.0\n",
> ++
> ++		/**
> ++		    We use a bigger os-image partition than the
> stock images (and thus
> ++		    smaller file-system), as our kernel doesn't fit
> in the stock firmware's
> ++		    1MB os-image.
> ++		*/
> ++		.partitions = {
> ++			{"factory-boot", 0x00000, 0x20000},
> ++			{"fs-uboot", 0x20000, 0x10000},
> ++			{"os-image", 0x30000, 0x180000},	/*
> Stock: base 0x30000 size 0x100000 */
> ++			{"file-system", 0x1b0000, 0x620000},	
> /* Stock: base 0x130000 size 0x6a0000 */
> ++			{"user-config", 0x7d0000, 0x04000},
> ++			{"default-mac", 0x7e0000, 0x00100},
> ++			{"device-id", 0x7e0100, 0x00100},
> ++			{"extra-para", 0x7e0200, 0x00100},
> ++			{"pin", 0x7e0300, 0x00100},
> ++			{"support-list", 0x7e0400, 0x00400},
> ++			{"soft-version", 0x7e0800, 0x00400},
> ++			{"product-info", 0x7e0c00, 0x01400},
> ++			{"partition-table", 0x7e2000, 0x01000},
> ++			{"profile", 0x7e3000, 0x01000},
> ++			{"default-config", 0x7e4000, 0x04000},
> ++			{"merge-config", 0x7ec000, 0x02000},
> ++			{"qos-db", 0x7ee000, 0x02000},
> ++			{"radio", 0x7f0000, 0x10000},
> ++			{NULL, 0, 0}
> ++		},
> ++
> ++		.first_sysupgrade_partition = "os-image",
> ++		.last_sysupgrade_partition = "file-system",
> ++	},
> ++
> + 	/** Firmware layout for the C5 */
> + 	{
> + 		.id = "ARCHER-C5-V2",
> +@@ -643,6 +685,15 @@ static struct image_partition_entry
> read_file(const char *part_name, const char
> + 	return entry;
> + }
> + 
> ++/** Creates a new image partition from arbitrary data */
> ++static struct image_partition_entry put_data(const char *part_name,
> const char *datain, size_t len) {
> ++
> ++	struct image_partition_entry entry =
> alloc_image_partition(part_name, len);
> ++
> ++	memcpy(entry.data, datain, len);
> ++
> ++	return entry;
> ++}
> + 
> + /**
> +    Copies a list of image partitions into an image buffer and
> generates the image partition table while doing so
> +@@ -824,7 +875,8 @@ static void build_image(const char *output,
> + 		bool add_jffs2_eof,
> + 		bool sysupgrade,
> + 		const struct device_info *info) {
> +-	struct image_partition_entry parts[6] = {};
> ++
> ++	struct image_partition_entry parts[7] = {};
> + 
> + 	parts[0] = make_partition_table(info->partitions);
> + 	if (info->soft_ver)
> +@@ -836,6 +888,11 @@ static void build_image(const char *output,
> + 	parts[3] = read_file("os-image", kernel_image, false);
> + 	parts[4] = read_file("file-system", rootfs_image,
> add_jffs2_eof);
> + 
> ++	if (strcasecmp(info->id, "ARCHER-C25-V1") == 0) {
> ++		const char mdat[11] = {0x00, 0x00, 0x00, 0x02,
> 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00};
> ++		parts[5] = put_data("extra-para", mdat, 11);
> ++	}
> ++
> + 	size_t len;
> + 	void *image;
> + 	if (sysupgrade)
> +-- 
> +2.1.4
> +
> diff --git a/src/packages/fff/fff-network/Makefile
> b/src/packages/fff/fff-network/Makefile
> index fee3f98..d34016c 100644
> --- a/src/packages/fff/fff-network/Makefile
> +++ b/src/packages/fff/fff-network/Makefile
> @@ -1,7 +1,7 @@
>  include $(TOPDIR)/rules.mk
>  
>  PKG_NAME:=fff-network
> -PKG_VERSION:=0.0.6
> +PKG_VERSION:=0.0.7
>  PKG_RELEASE:=1
>  
>  PKG_BUILD_DIR:=$(BUILD_DIR)/fff-network
> diff --git a/src/packages/fff/fff-network/ar71xx/network.archer-c25-
> v1 b/src/packages/fff/fff-network/ar71xx/network.archer-c25-v1
> new file mode 100644
> index 0000000..e524545
> --- /dev/null
> +++ b/src/packages/fff/fff-network/ar71xx/network.archer-c25-v1
> @@ -0,0 +1,8 @@
> +WANDEV=eth0
> +SWITCHDEV=eth1
> +CLIENT_PORTS="1 2 0t"
> +WAN_PORTS=""
> +BATMAN_PORTS="3 4 0t"
> +
> +ETHMESHMAC=eth1
> +ROUTERMAC=eth0