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