ar71xx: add support for TP-LINK Archer C7 v4
authorFelix Fietkau <nbd@nbd.name>
Tue, 25 Jul 2017 11:32:47 +0000 (13:32 +0200)
committerFelix Fietkau <nbd@nbd.name>
Thu, 19 Oct 2017 14:14:19 +0000 (16:14 +0200)
TP-Link Archer C7 v4 is a dual-band AC1750 router, based on Qualcomm/Atheros
QCA9561+QCA9888.

Specification:

- 775/650/258 MHz (CPU/DDR/AHB)
- 128 MB of RAM (DDR2)
- 16 MB of FLASH (SPI NOR)
- 3T3R 2.4 GHz
- 3T3R 5 GHz
- 5x 10/100/1000 Mbps Ethernet
- 7x LED, 2x button
- UART header on PCB

Flash instruction:
1. Upload lede-ar71xx-generic-archer-c7-v4-squashfs-factory.bin via Web interface

Flash instruction using TFTP recovery:
1. Set PC to fixed ip address 192.168.0.66
2. Download lede-ar71xx-generic-archer-c7-v4-squashfs-factory.bin
and rename it to ArcherC7v4_tp_recovery.bin
3. Start a tftp server with the file tp_recovery.bin in its root directory
4. Turn off the router
5. Press and hold Reset button
6. Turn on router with the reset button pressed and wait ~15 seconds
7. Release the reset button and after a short time
the firmware should be transferred from the tftp server
8. Wait ~30 second to complete recovery.

Flash instruction under U-Boot, using UART:

1. tftp 0x81000000 lede-ar71xx-...-sysupgrade.bin
2. erase 0x9f040000 +$filesize
3. cp.b $fileaddr 0x9f040000 $filesize
4. reset

Signed-off-by: Felix Fietkau <nbd@nbd.name>
12 files changed:
target/linux/ar71xx/base-files/etc/board.d/01_leds
target/linux/ar71xx/base-files/etc/board.d/02_network
target/linux/ar71xx/base-files/etc/diag.sh
target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
target/linux/ar71xx/base-files/lib/ar71xx.sh
target/linux/ar71xx/base-files/lib/upgrade/platform.sh
target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
target/linux/ar71xx/files/arch/mips/ath79/Makefile
target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c7-v4.c [new file with mode: 0644]
target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
target/linux/ar71xx/image/tp-link.mk
tools/firmware-utils/src/tplink-safeloader.c

index 0694fe954f006c39bf20248c70a6f9d32d07121b..27e6c8a0336df0a4c8026a0c34e7868b366b1cfa 100755 (executable)
@@ -58,7 +58,8 @@ sc1750|\
 sc450)
        ucidef_set_led_wlan "wlan" "WLAN" "$board:green:wlan" "phy0tpt"
        ;;
-archer-c25-v1)
+archer-c25-v1|\
+archer-c7-v4)
        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"
@@ -66,6 +67,12 @@ archer-c25-v1)
        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"
+       case "$board" in
+               archer-c7-v4)
+                       ucidef_set_led_usbdev "usb1" "USB1" "$board:green:usb1" "1-1"
+                       ucidef_set_led_usbdev "usb2" "USB2" "$board:green:usb2" "2-1"
+               ;;
+       esac
        ;;
 archer-c58-v1|\
 archer-c59-v1|\
index 46b217136d4f62ab9c021918f071a8d07f8805d3..a75f5fe29f1d1a0a27c5f301fbd578b150795029 100755 (executable)
@@ -428,6 +428,7 @@ ar71xx_setup_interfaces()
                ucidef_add_switch "switch0" \
                        "0@eth1" "1:lan:4" "2:lan:1" "3:lan:2" "4:lan:3"
                ;;
+       archer-c7-v4|\
        tl-wdr4300|\
        tl-wr1041n-v2)
                ucidef_add_switch "switch0" \
index 7fa4ff0bcc92a26aacead2fe33538986ddfba504..f4ad435ea728e21ab32be74bbdaa11edd6bb81d0 100644 (file)
@@ -58,6 +58,7 @@ get_status_led() {
        archer-c58-v1|\
        archer-c59-v1|\
        archer-c60-v1|\
+       archer-c7-v4|\
        fritz300e|\
        gl-usb150|\
        mr12|\
index 9a5f82b7cd6dfe3b3efc0f0860ae39926b9156e1..66796593c0504ff74d7bb12f08ba1975152c50b7 100644 (file)
@@ -54,6 +54,7 @@ case "$FIRMWARE" in
                ath10kcal_extract "ART" 20480 2116
                ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +16)
                ;;
+       archer-c7-v4|\
        archer-c25-v1|\
        archer-c59-v1|\
        archer-c60-v1|\
index 929845110a00f880d95d204917af18879bb8de8f..f89c0098e42c148b207fed742a303705aab72d39 100755 (executable)
@@ -452,6 +452,9 @@ ar71xx_board_detect() {
        *"Archer C5")
                name="archer-c5"
                ;;
+       *"Archer C7 v4")
+               name="archer-c7-v4"
+               ;;
        *"Archer C58 v1")
                name="archer-c58-v1"
                ;;
index 97d560189ff71b903885b205c9021d7670bc3ab9..3d6d9ed57f356e4c6ebdb808c931ea4b05369c2e 100755 (executable)
@@ -211,6 +211,7 @@ platform_check_image() {
        archer-c58-v1|\
        archer-c59-v1|\
        archer-c60-v1|\
+       archer-c7-v4|\
        bullet-m|\
        c-55|\
        carambola2|\
index 0b5bae69943c8fe21131f2f1b60034e0c4f7b360..5cb4f7ed3ec08cb29588616f60a1435b888c0a44 100644 (file)
@@ -1393,6 +1393,7 @@ config ATH79_MACH_ARCHER_C60_V1
 config ATH79_MACH_ARCHER_C7
        bool "TP-LINK Archer C5/C7/TL-WDR4900 v2 board support"
        select SOC_QCA955X
+       select SOC_QCA956X
        select ATH79_DEV_AP9X_PCI if PCI
        select ATH79_DEV_ETH
        select ATH79_DEV_GPIO_BUTTONS
index a8d9ddad9c9d00c9980aaedb136cec99375c14a3..7d12282baa598c0144f5310ef13fc7769341e59b 100644 (file)
@@ -63,6 +63,7 @@ obj-$(CONFIG_ATH79_MACH_ARCHER_C58_V1)                += mach-archer-c59-v1.o
 obj-$(CONFIG_ATH79_MACH_ARCHER_C59_V1)         += mach-archer-c59-v1.o
 obj-$(CONFIG_ATH79_MACH_ARCHER_C60_V1)         += mach-archer-c60-v1.o
 obj-$(CONFIG_ATH79_MACH_ARCHER_C7)             += mach-archer-c7.o
+obj-$(CONFIG_ATH79_MACH_ARCHER_C7)             += mach-archer-c7-v4.o
 obj-$(CONFIG_ATH79_MACH_ARDUINO_YUN)           += mach-arduino-yun.o
 obj-$(CONFIG_ATH79_MACH_AW_NR580)              += mach-aw-nr580.o
 obj-$(CONFIG_ATH79_MACH_BHR_4GRV2)             += mach-bhr-4grv2.o
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c7-v4.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-archer-c7-v4.c
new file mode 100644 (file)
index 0000000..64955c7
--- /dev/null
@@ -0,0 +1,260 @@
+
+/*
+ * Atheros ARCHER_C7 reference board support
+ *
+ * Copyright (c) 2017 Felix Fietkau <nbd@nbd.name>
+ * Copyright (c) 2014 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012 Gabor Juhos <juhosg@openwrt.org>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+
+#include <linux/platform_device.h>
+#include <linux/ath9k_platform.h>
+#include <linux/ar8216_platform.h>
+#include <linux/proc_fs.h>
+#include <linux/gpio.h>
+#include <linux/spi/spi_gpio.h>
+#include <linux/spi/74x164.h>
+
+#include <asm/mach-ath79/ar71xx_regs.h>
+
+#include "common.h"
+#include "dev-m25p80.h"
+#include "machtypes.h"
+#include "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"
+
+
+#define ARCHER_C7_GPIO_SHIFT_OE                1
+#define ARCHER_C7_GPIO_SHIFT_SER       14
+#define ARCHER_C7_GPIO_SHIFT_SRCLK     15
+#define ARCHER_C7_GPIO_SHIFT_RCLK      16
+#define ARCHER_C7_GPIO_SHIFT_SRCLR     21
+
+#define ARCHER_C7_GPIO_BTN_RESET       5
+#define ARCHER_C7_GPIO_BTN_WPS_WIFI    2
+
+#define ARCHER_C7_GPIO_LED_WLAN5       9
+#define ARCHER_C7_GPIO_LED_POWER       6
+#define ARCHER_C7_GPIO_LED_USB1                7
+#define ARCHER_C7_GPIO_LED_USB2                8
+
+#define ARCHER_C7_74HC_GPIO_BASE       QCA956X_GPIO_COUNT
+#define ARCHER_C7_GPIO_LED_WPS         (ARCHER_C7_74HC_GPIO_BASE + 0)
+#define ARCHER_C7_GPIO_LED_LAN1                (ARCHER_C7_74HC_GPIO_BASE + 1)
+#define ARCHER_C7_GPIO_LED_LAN2                (ARCHER_C7_74HC_GPIO_BASE + 2)
+#define ARCHER_C7_GPIO_LED_LAN3                (ARCHER_C7_74HC_GPIO_BASE + 3)
+#define ARCHER_C7_GPIO_LED_LAN4                (ARCHER_C7_74HC_GPIO_BASE + 4)
+#define ARCHER_C7_GPIO_LED_WAN_GREEN   (ARCHER_C7_74HC_GPIO_BASE + 5)
+#define ARCHER_C7_GPIO_LED_WAN_AMBER   (ARCHER_C7_74HC_GPIO_BASE + 6)
+#define ARCHER_C7_GPIO_LED_WLAN2       (ARCHER_C7_74HC_GPIO_BASE + 7)
+
+#define ARCHER_C7_KEYS_POLL_INTERVAL        20     /* msecs */
+#define ARCHER_C7_KEYS_DEBOUNCE_INTERVAL    (3 * ARCHER_C7_KEYS_POLL_INTERVAL)
+
+#define ARCHER_C7_MAC0_OFFSET               0
+#define ARCHER_C7_MAC1_OFFSET               6
+#define ARCHER_C7_WMAC_CALDATA_OFFSET       0x1000
+
+#define ARCHER_C7_GPIO_MDC                     3
+#define ARCHER_C7_GPIO_MDIO                    4
+
+static struct spi_gpio_platform_data archer_c7_v4_spi_data = {
+       .sck            = ARCHER_C7_GPIO_SHIFT_SRCLK,
+       .miso           = SPI_GPIO_NO_MISO,
+       .mosi           = ARCHER_C7_GPIO_SHIFT_SER,
+       .num_chipselect = 1,
+};
+
+static u8 archer_c7_v4_ssr_initdata __initdata = 0xff;
+
+static struct gen_74x164_chip_platform_data archer_c7_v4_ssr_data = {
+       .base = ARCHER_C7_74HC_GPIO_BASE,
+       .num_registers = 1,
+       .init_data = &archer_c7_v4_ssr_initdata,
+};
+
+static struct platform_device archer_c7_v4_spi_device = {
+       .name           = "spi_gpio",
+       .id             = 1,
+       .dev = {
+               .platform_data = &archer_c7_v4_spi_data,
+       },
+};
+
+static struct spi_board_info archer_c7_v4_spi_info[] = {
+       {
+               .bus_num                = 1,
+               .chip_select            = 0,
+               .max_speed_hz           = 10000000,
+               .modalias               = "74x164",
+               .platform_data          = &archer_c7_v4_ssr_data,
+               .controller_data        = (void *) ARCHER_C7_GPIO_SHIFT_RCLK,
+       },
+};
+
+static struct gpio_led archer_c7_v4_leds_gpio[] __initdata = {
+       {
+               .name           = "archer-c7-v4:green:power",
+               .gpio           = ARCHER_C7_GPIO_LED_POWER,
+               .active_low     = 1,
+       }, {
+               .name           = "archer-c7-v4:green:wps",
+               .gpio           = ARCHER_C7_GPIO_LED_WPS,
+               .active_low     = 1,
+       }, {
+               .name           = "archer-c7-v4:green:wlan2g",
+               .gpio           = ARCHER_C7_GPIO_LED_WLAN2,
+               .active_low     = 1,
+       }, {
+               .name           = "archer-c7-v4:green:wlan5g",
+               .gpio           = ARCHER_C7_GPIO_LED_WLAN5,
+               .active_low     = 1,
+       }, {
+               .name           = "archer-c7-v4:green:lan1",
+               .gpio           = ARCHER_C7_GPIO_LED_LAN1,
+               .active_low     = 1,
+       }, {
+               .name           = "archer-c7-v4:green:lan2",
+               .gpio           = ARCHER_C7_GPIO_LED_LAN2,
+               .active_low     = 1,
+       }, {
+               .name           = "archer-c7-v4:green:lan3",
+               .gpio           = ARCHER_C7_GPIO_LED_LAN3,
+               .active_low     = 1,
+       }, {
+               .name           = "archer-c7-v4:green:lan4",
+               .gpio           = ARCHER_C7_GPIO_LED_LAN4,
+               .active_low     = 1,
+       }, {
+               .name           = "archer-c7-v4:green:wan",
+               .gpio           =  ARCHER_C7_GPIO_LED_WAN_GREEN,
+               .active_low     = 1,
+       }, {
+               .name           = "archer-c7-v4:amber:wan",
+               .gpio           =  ARCHER_C7_GPIO_LED_WAN_AMBER,
+               .active_low     = 1,
+       }, {
+               .name           = "archer-c7-v4:green:usb1",
+               .gpio           =  ARCHER_C7_GPIO_LED_USB1,
+               .active_low     = 1,
+       }, {
+               .name           = "archer-c7-v4:green:usb2",
+               .gpio           =  ARCHER_C7_GPIO_LED_USB2,
+               .active_low     = 1,
+       },
+};
+
+static struct gpio_keys_button archer_c7_v4_gpio_keys[] __initdata = {
+        {
+                .desc           = "WPS and WIFI button",
+                .type           = EV_KEY,
+                .code           = KEY_WPS_BUTTON,
+                .debounce_interval = ARCHER_C7_KEYS_DEBOUNCE_INTERVAL,
+                .gpio           = ARCHER_C7_GPIO_BTN_WPS_WIFI,
+                .active_low     = 1,
+        },
+        {
+                .desc           = "Reset button",
+                .type           = EV_KEY,
+                .code           = KEY_RESTART,
+                .debounce_interval = ARCHER_C7_KEYS_DEBOUNCE_INTERVAL,
+                .gpio           = ARCHER_C7_GPIO_BTN_RESET,
+                .active_low     = 1,
+        },
+};
+
+static struct ar8327_pad_cfg archer_c7_v4_ar8337_pad0_cfg = {
+       .mode = AR8327_PAD_MAC_SGMII,
+       .sgmii_delay_en = true,
+};
+
+static struct ar8327_platform_data archer_c7_v4_ar8337_data = {
+       .pad0_cfg = &archer_c7_v4_ar8337_pad0_cfg,
+       .port0_cfg = {
+               .force_link = 1,
+               .speed = AR8327_PORT_SPEED_1000,
+               .duplex = 1,
+               .txpause = 1,
+               .rxpause = 1,
+       },
+};
+
+static struct mdio_board_info archer_c7_v4_mdio0_info[] = {
+       {
+               .bus_id = "ag71xx-mdio.0",
+               .phy_addr = 0,
+               .platform_data = &archer_c7_v4_ar8337_data,
+       },
+};
+
+
+static void __init archer_c7_v4_setup(void)
+{
+       u8 *art = (u8 *) KSEG1ADDR(0x1fff0000);
+       u8 *mac = (u8 *) KSEG1ADDR(0x1ff00008);
+
+       ath79_register_m25p80(NULL);
+
+       spi_register_board_info(archer_c7_v4_spi_info,
+                               ARRAY_SIZE(archer_c7_v4_spi_info));
+
+       platform_device_register(&archer_c7_v4_spi_device);
+
+       gpio_request_one(ARCHER_C7_GPIO_SHIFT_OE,
+                        GPIOF_OUT_INIT_LOW | GPIOF_EXPORT_DIR_FIXED,
+                        "LED control");
+
+       gpio_request_one(ARCHER_C7_GPIO_SHIFT_SRCLR,
+                        GPIOF_OUT_INIT_HIGH | GPIOF_EXPORT_DIR_FIXED,
+                        "LED reset");
+
+       ath79_register_leds_gpio(-1, ARRAY_SIZE(archer_c7_v4_leds_gpio),
+                               archer_c7_v4_leds_gpio);
+
+       ath79_register_gpio_keys_polled(-1, ARCHER_C7_KEYS_POLL_INTERVAL,
+                                       ARRAY_SIZE(archer_c7_v4_gpio_keys),
+                                       archer_c7_v4_gpio_keys);
+
+       ath79_register_usb();
+
+       ath79_gpio_output_select(ARCHER_C7_GPIO_MDC, QCA956X_GPIO_OUT_MUX_GE0_MDC);
+       ath79_gpio_output_select(ARCHER_C7_GPIO_MDIO, QCA956X_GPIO_OUT_MUX_GE0_MDO);
+
+       ath79_register_mdio(0, 0x0);
+
+       mdiobus_register_board_info(archer_c7_v4_mdio0_info,
+                                   ARRAY_SIZE(archer_c7_v4_mdio0_info));
+
+       ath79_register_wmac(art + ARCHER_C7_WMAC_CALDATA_OFFSET, mac);
+       ath79_register_pci();
+
+       /* GMAC0 is connected to an AR8337 switch */
+       ath79_init_mac(ath79_eth0_data.mac_addr, mac, 0);
+       ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_SGMII;
+       ath79_eth0_data.speed = SPEED_1000;
+       ath79_eth0_data.duplex = DUPLEX_FULL;
+       ath79_eth0_data.phy_mask = BIT(0);
+       ath79_eth0_data.mii_bus_dev = &ath79_mdio0_device.dev;
+       ath79_register_eth(0);
+}
+
+MIPS_MACHINE(ATH79_MACH_ARCHER_C7_V4, "ARCHER-C7-V4", "TP-LINK Archer C7 v4",
+            archer_c7_v4_setup);
index c75ff4f88a59d7d1546ff533ad7a331897877508..01472b679f32f2c604ee8e70e1a5c4c35e9b128a 100644 (file)
@@ -49,6 +49,7 @@ enum ath79_mach_type {
        ATH79_MACH_ARCHER_C60_V1,               /* TP-LINK Archer C60 V1 board */
        ATH79_MACH_ARCHER_C7,                   /* TP-LINK Archer C7 board */
        ATH79_MACH_ARCHER_C7_V2,                /* TP-LINK Archer C7 V2 board */
+       ATH79_MACH_ARCHER_C7_V4,                /* TP-LINK Archer C7 V4 board */
        ATH79_MACH_ARDUINO_YUN,                 /* Yun */
        ATH79_MACH_AW_NR580,                    /* AzureWave AW-NR580 */
        ATH79_MACH_BHR_4GRV2,                   /* Buffalo BHR-4GRV2 */
index 5d2518b6cad6891c93bd3ad3967c0a816282b402..ae711e7ce899ac43c6f773ff775dc1e2a427dc06 100644 (file)
@@ -200,7 +200,20 @@ define Device/tl-wdr7500-v3
   DEVICE_PROFILE := ARCHERC7
   TPLINK_HWID := 0x75000003
 endef
-TARGET_DEVICES += archer-c5-v1 archer-c7-v1 archer-c7-v2 archer-c7-v2-il tl-wdr7500-v3
+
+define Device/archer-c7-v4
+  $(Device/archer-cxx)
+  DEVICE_TITLE := TP-LINK Archer C7 v4
+  DEVICE_PACKAGES := kmod-ath10k ath10k-firmware-qca988x
+  BOARDNAME := ARCHER-C7-V4
+  TPLINK_BOARD_ID := ARCHER-C7-V4
+  IMAGE_SIZE := 15104k
+  LOADER_TYPE := elf
+  MTDPARTS := spi0.0:128k(factory-uboot)ro,128k(u-boot)ro,1536k(kernel),13568k(rootfs),960k(config)ro,64k(art)ro,15104k@0x40000(firmware)
+  SUPPORTED_DEVICES := archer-c7-v4
+endef
+
+TARGET_DEVICES += archer-c5-v1 archer-c7-v1 archer-c7-v2 archer-c7-v2-il tl-wdr7500-v3 archer-c7-v4
 
 define Device/cpe510-520-v1
   DEVICE_TITLE := TP-LINK CPE510/520 v1
index dceba75da56d8c39eb654c68b1ec2277ed2c872e..219d1985acfd7fe18b2798cd29f1a8f6649d20ce 100644 (file)
@@ -485,6 +485,49 @@ static struct device_info boards[] = {
                .last_sysupgrade_partition = "file-system"
        },
 
+       /** Firmware layout for the C7 */
+       {
+               .id = "ARCHER-C7-V4",
+               .support_list =
+                       "SupportList:\n"
+                       "{product_name:Archer C7,product_ver:4.0.0,special_id:45550000}\n"
+                       "{product_name:Archer C7,product_ver:4.0.0,special_id:55530000}\n"
+                       "{product_name:Archer C7,product_ver:4.0.0,special_id:43410000}\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, 0x20000},
+                       {"os-image", 0x40000, 0x180000},        /* Stock: base 0x40000 size 0x120000 */
+                       {"file-system", 0x1c0000, 0xd40000},    /* Stock: base 0x160000 size 0xda0000 */
+                       {"default-mac", 0xf00000, 0x00200},
+                       {"pin", 0xf00200, 0x00200},
+                       {"device-id", 0xf00400, 0x00100},
+                       {"product-info", 0xf00500, 0x0fb00},
+                       {"soft-version", 0xf10000, 0x00100},
+                       {"extra-para", 0xf11000, 0x01000},
+                       {"support-list", 0xf12000, 0x0a000},
+                       {"profile", 0xf1c000, 0x04000},
+                       {"default-config", 0xf20000, 0x10000},
+                       {"user-config", 0xf30000, 0x40000},
+                       {"qos-db", 0xf70000, 0x40000},
+                       {"certificate", 0xfb0000, 0x10000},
+                       {"partition-table", 0xfc0000, 0x10000},
+                       {"log", 0xfd0000, 0x20000},
+                       {"radio", 0xff0000, 0x10000},
+                       {NULL, 0, 0}
+               },
+
+               .first_sysupgrade_partition = "os-image",
+               .last_sysupgrade_partition = "file-system",
+       },
+
        /** Firmware layout for the C9 */
        {
                .id = "ARCHERC9",
@@ -1214,6 +1257,9 @@ static void build_image(const char *output,
        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);
+       } else if (strcasecmp(info->id, "ARCHER-C7-V4") == 0) {
+               const char mdat[11] = {0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0xca, 0x00, 0x01, 0x00, 0x00};
+               parts[5] = put_data("extra-para", mdat, 11);
        }
 
        size_t len;