[v1,3/3] Add support for TP-Link C25

Submitted by Tim Niemeyer on July 1, 2017, 5:06 p.m.

Details

Message ID 1498928816-12109-3-git-send-email-tim@tn-x.org
State Superseded
Headers show

Commit Message

Tim Niemeyer July 1, 2017, 5:06 p.m.
Signed-off-by: Tim Niemeyer <tim@tn-x.org>
---

 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 | 483 +++++++++++++++++++++
 ...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, 770 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..78dee3d
--- /dev/null
+++ b/build_patches/openwrt/0005-firmware-utils-tplink-safeloader-support-strings-as-.patch
@@ -0,0 +1,162 @@ 
+From d0828f2bc391e0eff5240eb50de2d8eb0c9c1909 Mon Sep 17 00:00:00 2001
+From: Jan Niehusmann <jan@gondor.com>
+Date: Fri, 19 May 2017 09:42:24 +0200
+Subject: [PATCH 1/3] 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 tools/firmware-utils/src/tplink-safeloader.c tools/firmware-utils/src/tplink-safeloader.c
+index 4e3d205..688cdac 100644
+--- tools/firmware-utils/src/tplink-safeloader.c
++++ 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..eaddb36
--- /dev/null
+++ b/build_patches/openwrt/0006-ar71xx-add-support-for-TP-Link-Archer-C25-v1.patch
@@ -0,0 +1,483 @@ 
+From 205e86e9b8492136a5283fa895220b4f3e05c6d3 Mon Sep 17 00:00:00 2001
+From: Ludwig Thomeczek <ledesrc@wxorx.net>
+Date: Sat, 22 Apr 2017 18:21:47 +0200
+Subject: [PATCH 2/3] 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                     |   1 +
+ .../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, 283 insertions(+)
+ create mode 100644 target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c
+
+diff --git target/linux/ar71xx/base-files/etc/board.d/01_leds target/linux/ar71xx/base-files/etc/board.d/01_leds
+index 0279dfc..3aa2bfb 100755
+--- target/linux/ar71xx/base-files/etc/board.d/01_leds
++++ 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 target/linux/ar71xx/base-files/etc/board.d/02_network target/linux/ar71xx/base-files/etc/board.d/02_network
+index c8c7827..4404e80 100755
+--- target/linux/ar71xx/base-files/etc/board.d/02_network
++++ 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 target/linux/ar71xx/base-files/etc/diag.sh target/linux/ar71xx/base-files/etc/diag.sh
+index 7b8aac8..cf6278c 100644
+--- target/linux/ar71xx/base-files/etc/diag.sh
++++ 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 target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
+index b3e23c9..68f90de 100644
+--- target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
++++ 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 target/linux/ar71xx/base-files/lib/ar71xx.sh target/linux/ar71xx/base-files/lib/ar71xx.sh
+index b035535..0d01c5e 100755
+--- target/linux/ar71xx/base-files/lib/ar71xx.sh
++++ 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 target/linux/ar71xx/base-files/lib/upgrade/platform.sh target/linux/ar71xx/base-files/lib/upgrade/platform.sh
+index 580e09a..e2aaceb 100755
+--- target/linux/ar71xx/base-files/lib/upgrade/platform.sh
++++ 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 target/linux/ar71xx/config-4.4 target/linux/ar71xx/config-4.4
+index ff6bb13..d9c7885 100644
+--- target/linux/ar71xx/config-4.4
++++ 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
+diff --git target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
+index 76ba6fa..d49659c 100644
+--- target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
++++ 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 target/linux/ar71xx/files/arch/mips/ath79/Makefile target/linux/ar71xx/files/arch/mips/ath79/Makefile
+index c91d03f..fc28716 100644
+--- target/linux/ar71xx/files/arch/mips/ath79/Makefile
++++ 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 target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c
+new file mode 100644
+index 0000000..a0f001c
+--- /dev/null
++++ 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 target/linux/ar71xx/files/arch/mips/ath79/machtypes.h target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
+index b9a8e3e..53f0d1c 100644
+--- target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
++++ 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 target/linux/ar71xx/image/tp-link.mk target/linux/ar71xx/image/tp-link.mk
+index 1c88f43..f70c12c 100644
+--- target/linux/ar71xx/image/tp-link.mk
++++ 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 target/linux/ar71xx/mikrotik/config-default target/linux/ar71xx/mikrotik/config-default
+index 44ea327..3f11c23 100644
+--- target/linux/ar71xx/mikrotik/config-default
++++ 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 target/linux/ar71xx/nand/config-default target/linux/ar71xx/nand/config-default
+index 515266b..6357531 100644
+--- target/linux/ar71xx/nand/config-default
++++ 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..a9345bc
--- /dev/null
+++ b/build_patches/openwrt/0007-firmware-utils-tplink-safeloader-add-TP-Link-Archer-.patch
@@ -0,0 +1,112 @@ 
+From a0183cdf40fdb7e136c9ca8c74542e62f1f17278 Mon Sep 17 00:00:00 2001
+From: Ludwig Thomeczek <ledesrc@wxorx.net>
+Date: Sat, 13 May 2017 11:40:48 +0200
+Subject: [PATCH 3/3] 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 tools/firmware-utils/src/tplink-safeloader.c tools/firmware-utils/src/tplink-safeloader.c
+index 688cdac..2468426 100644
+--- tools/firmware-utils/src/tplink-safeloader.c
++++ 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

Christian Dresel July 2, 2017, 4:20 p.m.
Hi

danke für deine Arbeit. Ich hab das ganze mal überflogen, unser internes
Zeug soweit verstanden und ist ok. Das ganze LEDE C bin ich aber
wirklich nur ganz grob durchgegangen und testen kann ich es aus Mangel
an Hardware auch nicht.

Ich setzt dennoch mal ein

Reviewed-by: Christian Dresel <fff@chrisi01.de>

darunter mit den oben genannten Einschränkungen.

mfg

Christian

On 01.07.2017 19:06, Tim Niemeyer wrote:
> Signed-off-by: Tim Niemeyer <tim@tn-x.org>
> ---
> 
>  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 | 483 +++++++++++++++++++++
>  ...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, 770 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..78dee3d
> --- /dev/null
> +++ b/build_patches/openwrt/0005-firmware-utils-tplink-safeloader-support-strings-as-.patch
> @@ -0,0 +1,162 @@
> +From d0828f2bc391e0eff5240eb50de2d8eb0c9c1909 Mon Sep 17 00:00:00 2001
> +From: Jan Niehusmann <jan@gondor.com>
> +Date: Fri, 19 May 2017 09:42:24 +0200
> +Subject: [PATCH 1/3] 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 tools/firmware-utils/src/tplink-safeloader.c tools/firmware-utils/src/tplink-safeloader.c
> +index 4e3d205..688cdac 100644
> +--- tools/firmware-utils/src/tplink-safeloader.c
> ++++ 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..eaddb36
> --- /dev/null
> +++ b/build_patches/openwrt/0006-ar71xx-add-support-for-TP-Link-Archer-C25-v1.patch
> @@ -0,0 +1,483 @@
> +From 205e86e9b8492136a5283fa895220b4f3e05c6d3 Mon Sep 17 00:00:00 2001
> +From: Ludwig Thomeczek <ledesrc@wxorx.net>
> +Date: Sat, 22 Apr 2017 18:21:47 +0200
> +Subject: [PATCH 2/3] 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                     |   1 +
> + .../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, 283 insertions(+)
> + create mode 100644 target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c
> +
> +diff --git target/linux/ar71xx/base-files/etc/board.d/01_leds target/linux/ar71xx/base-files/etc/board.d/01_leds
> +index 0279dfc..3aa2bfb 100755
> +--- target/linux/ar71xx/base-files/etc/board.d/01_leds
> ++++ 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 target/linux/ar71xx/base-files/etc/board.d/02_network target/linux/ar71xx/base-files/etc/board.d/02_network
> +index c8c7827..4404e80 100755
> +--- target/linux/ar71xx/base-files/etc/board.d/02_network
> ++++ 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 target/linux/ar71xx/base-files/etc/diag.sh target/linux/ar71xx/base-files/etc/diag.sh
> +index 7b8aac8..cf6278c 100644
> +--- target/linux/ar71xx/base-files/etc/diag.sh
> ++++ 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 target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> +index b3e23c9..68f90de 100644
> +--- target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> ++++ 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 target/linux/ar71xx/base-files/lib/ar71xx.sh target/linux/ar71xx/base-files/lib/ar71xx.sh
> +index b035535..0d01c5e 100755
> +--- target/linux/ar71xx/base-files/lib/ar71xx.sh
> ++++ 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 target/linux/ar71xx/base-files/lib/upgrade/platform.sh target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> +index 580e09a..e2aaceb 100755
> +--- target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> ++++ 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 target/linux/ar71xx/config-4.4 target/linux/ar71xx/config-4.4
> +index ff6bb13..d9c7885 100644
> +--- target/linux/ar71xx/config-4.4
> ++++ 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
> +diff --git target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> +index 76ba6fa..d49659c 100644
> +--- target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> ++++ 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 target/linux/ar71xx/files/arch/mips/ath79/Makefile target/linux/ar71xx/files/arch/mips/ath79/Makefile
> +index c91d03f..fc28716 100644
> +--- target/linux/ar71xx/files/arch/mips/ath79/Makefile
> ++++ 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 target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c
> +new file mode 100644
> +index 0000000..a0f001c
> +--- /dev/null
> ++++ 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 target/linux/ar71xx/files/arch/mips/ath79/machtypes.h target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> +index b9a8e3e..53f0d1c 100644
> +--- target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> ++++ 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 target/linux/ar71xx/image/tp-link.mk target/linux/ar71xx/image/tp-link.mk
> +index 1c88f43..f70c12c 100644
> +--- target/linux/ar71xx/image/tp-link.mk
> ++++ 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 target/linux/ar71xx/mikrotik/config-default target/linux/ar71xx/mikrotik/config-default
> +index 44ea327..3f11c23 100644
> +--- target/linux/ar71xx/mikrotik/config-default
> ++++ 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 target/linux/ar71xx/nand/config-default target/linux/ar71xx/nand/config-default
> +index 515266b..6357531 100644
> +--- target/linux/ar71xx/nand/config-default
> ++++ 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..a9345bc
> --- /dev/null
> +++ b/build_patches/openwrt/0007-firmware-utils-tplink-safeloader-add-TP-Link-Archer-.patch
> @@ -0,0 +1,112 @@
> +From a0183cdf40fdb7e136c9ca8c74542e62f1f17278 Mon Sep 17 00:00:00 2001
> +From: Ludwig Thomeczek <ledesrc@wxorx.net>
> +Date: Sat, 13 May 2017 11:40:48 +0200
> +Subject: [PATCH 3/3] 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 tools/firmware-utils/src/tplink-safeloader.c tools/firmware-utils/src/tplink-safeloader.c
> +index 688cdac..2468426 100644
> +--- tools/firmware-utils/src/tplink-safeloader.c
> ++++ 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
>
Christian Dresel July 7, 2017, 10:33 a.m.
hi

ich habs nuna uch getestet und noch 2 Anmerkungen:

- Die LEDs leuchten alle (bis auf Power) dauerhaft. Nach meinen Infos
sollten sie im LEDE Master aber gehen.
- Batman scheint auf den w5mesh Interface nicht zu gehen. Ich kann zwar
über das AdHoc pingen und sogar per SSH von einen Router auf den anderen
zugreifen (fe80::MAC%w5mesh geht) aber Batman selbst geht nicht (sobald
ich w2mesh ausschalte und das Batmankabel ziehe ist der Router isoliert
man kommt nur noch direkt per AdHoc drauf und ein batctl o sagt dann "no
nodes in Range"). batctl if sagt aber das Batman auf den Interface
liegt. Wieso/weshalb muss man mal gucken.

mfg

Christian

On 02.07.2017 18:20, Christian Dresel wrote:
> Hi
> 
> danke für deine Arbeit. Ich hab das ganze mal überflogen, unser internes
> Zeug soweit verstanden und ist ok. Das ganze LEDE C bin ich aber
> wirklich nur ganz grob durchgegangen und testen kann ich es aus Mangel
> an Hardware auch nicht.
> 
> Ich setzt dennoch mal ein
> 
> Reviewed-by: Christian Dresel <fff@chrisi01.de>
> 
> darunter mit den oben genannten Einschränkungen.
> 
> mfg
> 
> Christian
> 
> On 01.07.2017 19:06, Tim Niemeyer wrote:
>> Signed-off-by: Tim Niemeyer <tim@tn-x.org>
>> ---
>>
>>  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 | 483 +++++++++++++++++++++
>>  ...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, 770 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..78dee3d
>> --- /dev/null
>> +++ b/build_patches/openwrt/0005-firmware-utils-tplink-safeloader-support-strings-as-.patch
>> @@ -0,0 +1,162 @@
>> +From d0828f2bc391e0eff5240eb50de2d8eb0c9c1909 Mon Sep 17 00:00:00 2001
>> +From: Jan Niehusmann <jan@gondor.com>
>> +Date: Fri, 19 May 2017 09:42:24 +0200
>> +Subject: [PATCH 1/3] 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 tools/firmware-utils/src/tplink-safeloader.c tools/firmware-utils/src/tplink-safeloader.c
>> +index 4e3d205..688cdac 100644
>> +--- tools/firmware-utils/src/tplink-safeloader.c
>> ++++ 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..eaddb36
>> --- /dev/null
>> +++ b/build_patches/openwrt/0006-ar71xx-add-support-for-TP-Link-Archer-C25-v1.patch
>> @@ -0,0 +1,483 @@
>> +From 205e86e9b8492136a5283fa895220b4f3e05c6d3 Mon Sep 17 00:00:00 2001
>> +From: Ludwig Thomeczek <ledesrc@wxorx.net>
>> +Date: Sat, 22 Apr 2017 18:21:47 +0200
>> +Subject: [PATCH 2/3] 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                     |   1 +
>> + .../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, 283 insertions(+)
>> + create mode 100644 target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c
>> +
>> +diff --git target/linux/ar71xx/base-files/etc/board.d/01_leds target/linux/ar71xx/base-files/etc/board.d/01_leds
>> +index 0279dfc..3aa2bfb 100755
>> +--- target/linux/ar71xx/base-files/etc/board.d/01_leds
>> ++++ 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 target/linux/ar71xx/base-files/etc/board.d/02_network target/linux/ar71xx/base-files/etc/board.d/02_network
>> +index c8c7827..4404e80 100755
>> +--- target/linux/ar71xx/base-files/etc/board.d/02_network
>> ++++ 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 target/linux/ar71xx/base-files/etc/diag.sh target/linux/ar71xx/base-files/etc/diag.sh
>> +index 7b8aac8..cf6278c 100644
>> +--- target/linux/ar71xx/base-files/etc/diag.sh
>> ++++ 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 target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
>> +index b3e23c9..68f90de 100644
>> +--- target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
>> ++++ 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 target/linux/ar71xx/base-files/lib/ar71xx.sh target/linux/ar71xx/base-files/lib/ar71xx.sh
>> +index b035535..0d01c5e 100755
>> +--- target/linux/ar71xx/base-files/lib/ar71xx.sh
>> ++++ 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 target/linux/ar71xx/base-files/lib/upgrade/platform.sh target/linux/ar71xx/base-files/lib/upgrade/platform.sh
>> +index 580e09a..e2aaceb 100755
>> +--- target/linux/ar71xx/base-files/lib/upgrade/platform.sh
>> ++++ 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 target/linux/ar71xx/config-4.4 target/linux/ar71xx/config-4.4
>> +index ff6bb13..d9c7885 100644
>> +--- target/linux/ar71xx/config-4.4
>> ++++ 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
>> +diff --git target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
>> +index 76ba6fa..d49659c 100644
>> +--- target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
>> ++++ 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 target/linux/ar71xx/files/arch/mips/ath79/Makefile target/linux/ar71xx/files/arch/mips/ath79/Makefile
>> +index c91d03f..fc28716 100644
>> +--- target/linux/ar71xx/files/arch/mips/ath79/Makefile
>> ++++ 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 target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c
>> +new file mode 100644
>> +index 0000000..a0f001c
>> +--- /dev/null
>> ++++ 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 target/linux/ar71xx/files/arch/mips/ath79/machtypes.h target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
>> +index b9a8e3e..53f0d1c 100644
>> +--- target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
>> ++++ 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 target/linux/ar71xx/image/tp-link.mk target/linux/ar71xx/image/tp-link.mk
>> +index 1c88f43..f70c12c 100644
>> +--- target/linux/ar71xx/image/tp-link.mk
>> ++++ 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 target/linux/ar71xx/mikrotik/config-default target/linux/ar71xx/mikrotik/config-default
>> +index 44ea327..3f11c23 100644
>> +--- target/linux/ar71xx/mikrotik/config-default
>> ++++ 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 target/linux/ar71xx/nand/config-default target/linux/ar71xx/nand/config-default
>> +index 515266b..6357531 100644
>> +--- target/linux/ar71xx/nand/config-default
>> ++++ 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..a9345bc
>> --- /dev/null
>> +++ b/build_patches/openwrt/0007-firmware-utils-tplink-safeloader-add-TP-Link-Archer-.patch
>> @@ -0,0 +1,112 @@
>> +From a0183cdf40fdb7e136c9ca8c74542e62f1f17278 Mon Sep 17 00:00:00 2001
>> +From: Ludwig Thomeczek <ledesrc@wxorx.net>
>> +Date: Sat, 13 May 2017 11:40:48 +0200
>> +Subject: [PATCH 3/3] 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 tools/firmware-utils/src/tplink-safeloader.c tools/firmware-utils/src/tplink-safeloader.c
>> +index 688cdac..2468426 100644
>> +--- tools/firmware-utils/src/tplink-safeloader.c
>> ++++ 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
>>
> 
> 
>
Tim Niemeyer July 8, 2017, 11:28 a.m.
Am Freitag, den 07.07.2017, 12:33 +0200 schrieb Christian Dresel:
> hi
> 
> ich habs nuna uch getestet und noch 2 Anmerkungen:
> 
> - Die LEDs leuchten alle (bis auf Power) dauerhaft. Nach meinen Infos
> sollten sie im LEDE Master aber gehen.
Ja, v2 hab ich geschickt, da sollte das behoben sein.

> - Batman scheint auf den w5mesh Interface nicht zu gehen. Ich kann zwar
> über das AdHoc pingen und sogar per SSH von einen Router auf den anderen
> zugreifen (fe80::MAC%w5mesh geht) aber Batman selbst geht nicht (sobald
> ich w2mesh ausschalte und das Batmankabel ziehe ist der Router isoliert
> man kommt nur noch direkt per AdHoc drauf und ein batctl o sagt dann "no
> nodes in Range"). batctl if sagt aber das Batman auf den Interface
> liegt. Wieso/weshalb muss man mal gucken.
Ich befürchte bei dem 5 GHz Thema können wir grad nicht so viel machen.
Mir fehlt da jedenfalls die Zeit.

Tim

> mfg
> 
> Christian
> 
> On 02.07.2017 18:20, Christian Dresel wrote:
> > Hi
> > 
> > danke für deine Arbeit. Ich hab das ganze mal überflogen, unser internes
> > Zeug soweit verstanden und ist ok. Das ganze LEDE C bin ich aber
> > wirklich nur ganz grob durchgegangen und testen kann ich es aus Mangel
> > an Hardware auch nicht.
> > 
> > Ich setzt dennoch mal ein
> > 
> > Reviewed-by: Christian Dresel <fff@chrisi01.de>
> > 
> > darunter mit den oben genannten Einschränkungen.
> > 
> > mfg
> > 
> > Christian
> > 
> > On 01.07.2017 19:06, Tim Niemeyer wrote:
> >> Signed-off-by: Tim Niemeyer <tim@tn-x.org>
> >> ---
> >>
> >>  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 | 483 +++++++++++++++++++++
> >>  ...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, 770 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..78dee3d
> >> --- /dev/null
> >> +++ b/build_patches/openwrt/0005-firmware-utils-tplink-safeloader-support-strings-as-.patch
> >> @@ -0,0 +1,162 @@
> >> +From d0828f2bc391e0eff5240eb50de2d8eb0c9c1909 Mon Sep 17 00:00:00 2001
> >> +From: Jan Niehusmann <jan@gondor.com>
> >> +Date: Fri, 19 May 2017 09:42:24 +0200
> >> +Subject: [PATCH 1/3] 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 tools/firmware-utils/src/tplink-safeloader.c tools/firmware-utils/src/tplink-safeloader.c
> >> +index 4e3d205..688cdac 100644
> >> +--- tools/firmware-utils/src/tplink-safeloader.c
> >> ++++ 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..eaddb36
> >> --- /dev/null
> >> +++ b/build_patches/openwrt/0006-ar71xx-add-support-for-TP-Link-Archer-C25-v1.patch
> >> @@ -0,0 +1,483 @@
> >> +From 205e86e9b8492136a5283fa895220b4f3e05c6d3 Mon Sep 17 00:00:00 2001
> >> +From: Ludwig Thomeczek <ledesrc@wxorx.net>
> >> +Date: Sat, 22 Apr 2017 18:21:47 +0200
> >> +Subject: [PATCH 2/3] 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                     |   1 +
> >> + .../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, 283 insertions(+)
> >> + create mode 100644 target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c
> >> +
> >> +diff --git target/linux/ar71xx/base-files/etc/board.d/01_leds target/linux/ar71xx/base-files/etc/board.d/01_leds
> >> +index 0279dfc..3aa2bfb 100755
> >> +--- target/linux/ar71xx/base-files/etc/board.d/01_leds
> >> ++++ 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 target/linux/ar71xx/base-files/etc/board.d/02_network target/linux/ar71xx/base-files/etc/board.d/02_network
> >> +index c8c7827..4404e80 100755
> >> +--- target/linux/ar71xx/base-files/etc/board.d/02_network
> >> ++++ 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 target/linux/ar71xx/base-files/etc/diag.sh target/linux/ar71xx/base-files/etc/diag.sh
> >> +index 7b8aac8..cf6278c 100644
> >> +--- target/linux/ar71xx/base-files/etc/diag.sh
> >> ++++ 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 target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> >> +index b3e23c9..68f90de 100644
> >> +--- target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> >> ++++ 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 target/linux/ar71xx/base-files/lib/ar71xx.sh target/linux/ar71xx/base-files/lib/ar71xx.sh
> >> +index b035535..0d01c5e 100755
> >> +--- target/linux/ar71xx/base-files/lib/ar71xx.sh
> >> ++++ 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 target/linux/ar71xx/base-files/lib/upgrade/platform.sh target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> >> +index 580e09a..e2aaceb 100755
> >> +--- target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> >> ++++ 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 target/linux/ar71xx/config-4.4 target/linux/ar71xx/config-4.4
> >> +index ff6bb13..d9c7885 100644
> >> +--- target/linux/ar71xx/config-4.4
> >> ++++ 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
> >> +diff --git target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> >> +index 76ba6fa..d49659c 100644
> >> +--- target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> >> ++++ 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 target/linux/ar71xx/files/arch/mips/ath79/Makefile target/linux/ar71xx/files/arch/mips/ath79/Makefile
> >> +index c91d03f..fc28716 100644
> >> +--- target/linux/ar71xx/files/arch/mips/ath79/Makefile
> >> ++++ 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 target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c25-v1.c
> >> +new file mode 100644
> >> +index 0000000..a0f001c
> >> +--- /dev/null
> >> ++++ 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 target/linux/ar71xx/files/arch/mips/ath79/machtypes.h target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> >> +index b9a8e3e..53f0d1c 100644
> >> +--- target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> >> ++++ 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 target/linux/ar71xx/image/tp-link.mk target/linux/ar71xx/image/tp-link.mk
> >> +index 1c88f43..f70c12c 100644
> >> +--- target/linux/ar71xx/image/tp-link.mk
> >> ++++ 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 target/linux/ar71xx/mikrotik/config-default target/linux/ar71xx/mikrotik/config-default
> >> +index 44ea327..3f11c23 100644
> >> +--- target/linux/ar71xx/mikrotik/config-default
> >> ++++ 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 target/linux/ar71xx/nand/config-default target/linux/ar71xx/nand/config-default
> >> +index 515266b..6357531 100644
> >> +--- target/linux/ar71xx/nand/config-default
> >> ++++ 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..a9345bc
> >> --- /dev/null
> >> +++ b/build_patches/openwrt/0007-firmware-utils-tplink-safeloader-add-TP-Link-Archer-.patch
> >> @@ -0,0 +1,112 @@
> >> +From a0183cdf40fdb7e136c9ca8c74542e62f1f17278 Mon Sep 17 00:00:00 2001
> >> +From: Ludwig Thomeczek <ledesrc@wxorx.net>
> >> +Date: Sat, 13 May 2017 11:40:48 +0200
> >> +Subject: [PATCH 3/3] 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 tools/firmware-utils/src/tplink-safeloader.c tools/firmware-utils/src/tplink-safeloader.c
> >> +index 688cdac..2468426 100644
> >> +--- tools/firmware-utils/src/tplink-safeloader.c
> >> ++++ 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
> >>
> > 
> > 
> > 
>