OpenWrt Forum Archive

Topic: Support for TP-Link Archer C2600

The content of this topic has been archived between 29 Mar 2018 and 6 May 2018. Unfortunately there are posts – most likely complete pages – missing.

Which builds specifically have you tried?

r48132
r48147
r48196
r48233
r48252
r48259
Edit:----
r48479
r48548

(Last edited by ccmenb on 29 Jan 2016, 20:08)

Ok, thanks.

Has anyone tried one of these builds on a V1.0 router?

I had all except one of them installed and all worked without a problem. Only thing I needed to do was to do one reboot after the install. Because all of them got stuck...
I flash the image wait 5 min, then I reboot it. After that it takes another 2-3minutes to boot up and then it is running just fine.
@ccmenb: Did you try rebooting the device?

Yes, I also tried rebooting the router, getting the same result.

I can confirm the hardware is identical in both versions, so it's bizarre as to why you are seeing any difference at all.

Historically, also, TP-link have always brought out version revisions eg v1.1, v1.2, v1.5, v1.7 but its the first number that counts. They never change the hardware if the first number is the same, just the pre-loaded firmware. If any hardware would have changed, it would be v2.x

Thanks

I can confirm that the version r48479 does not seem to work on v1.1.

ccmenb wrote:

I can confirm that the version r48479 does not seem to work on v1.1.

Same here. Flash goes through, reboot, then no lights, no ping, does not seems to boot.

tedster22 wrote:

I can confirm the hardware is identical in both versions, so it's bizarre as to why you are seeing any difference at all.

Historically, also, TP-link have always brought out version revisions eg v1.1, v1.2, v1.5, v1.7 but its the first number that counts. They never change the hardware if the first number is the same, just the pre-loaded firmware. If any hardware would have changed, it would be v2.x

Thanks

I wonder if the difference is in the contents of some of the flash partitions which are normally not overwritten by stock or openwrt firmware updates.

bendavid wrote:

I wonder if the difference is in the contents of some of the flash partitions which are normally not overwritten by stock or openwrt firmware updates.

That would probably have to be something along those lines -- they haven't pushed out any variants on the firmware's available on the website, so they don't need something else along those lines (or they haven't released the firmware blobs yet).

I think the same, probably just some new mapping required. The HW is definitely identical so this should be supportable.

Did anyone ever figure out how to get the real MAC addresses out of the device?

Thanks

Just tested the latest r48548 build (Friday) and I have the same behaviour: flash goes through, router reboots, no led, no activity, just doesn't boot.

Thanks

The strangeness continues. I received and unboxed a C2600 today. It is labeled as v1.1 on both the box and on the C2600 itself. The factory software identifies it as hardware v1.0.

The QSDK build flashed and booted fine. (MAC addresses correct and matches sticker on hardware)
Arokh's R48548 build flashed and booted fine. (MAC addresses wrong as previously noted)

I will try to get a serial port installed tomorrow and possibly dig out the latest version of @bendavid's patches from OpenWRT-Devel and get my tree setup to build images for it.

(Last edited by bdheaton on 31 Jan 2016, 07:59)

Yes it is mysterious. I tried to run the r48548 build, again, therefore TP-Link's WebUI as the TFTP method, and once the device loads the flash and resets no longer back to boot. Same as @RedVortex.

Which R48548 file are you flashing with?

ccmenb wrote:

Yes it is mysterious. I tried to run the r48548 build, again, therefore TP-Link's WebUI as the TFTP method, and once the device loads the flash and resets no longer back to boot. Same as @RedVortex.

Heinz wrote:

I have the same problem.
C2600 v1.1
Firmware: http://luci.subsignal.org/~trondah/c260 … actory.bin

I'm curious, what firmware from TP-Link are you using, the US or the International one ? I'm asking because, by mistake, I've installed the US one and I know it is different in some way from the International one because I cannot change the language or the country in the wireless settings anymore, it is stuck and grayed-out as United States.

Re-pushing the international one doesn't change anything, country is now fixed.

So, back to why I'm asking this: maybe we cannot install OpenWRT over the US-based firmware but it works over the International one ?

I also wonder if it is possible to re-enable the country selection, if anyone knows...

Hey guys. First of all a big thanks to bendavid for the progress he made without a working serial connection!

If experimented a bit with this device (V1.0) and the patches on the devel list - it's a bit difficult to get them together and fix them for current trunk. This is the patch I'm working with at the moment:

 include/image.mk                                   |  11 +
 .../linux/ipq806x/base-files/etc/board.d/01_leds   |   7 +
 .../ipq806x/base-files/etc/board.d/02_network      |   3 +-
 .../etc/hotplug.d/firmware/11-ath10k-caldata       |  66 +++++
 target/linux/ipq806x/base-files/lib/ipq806x.sh     |   3 +
 .../ipq806x/base-files/lib/upgrade/platform.sh     |  34 ++-
 target/linux/ipq806x/image/Makefile                |  24 +-
 ...qcom-add-TP-Link-Archer-C2600-device-tree.patch | 300 +++++++++++++++++++++
 ...qcom-add-TP-Link-Archer-C2600-device-tree.patch | 300 +++++++++++++++++++++
 target/linux/ipq806x/profiles/tplink.mk            |  20 ++
 tools/firmware-utils/src/tplink-safeloader.c       | 114 +++++++-
 12 files changed, 891 insertions(+), 6 deletions(-)
 create mode 100644 package/kernel/mac80211/patches/941-ath10k_skip_otp_check.patch
 create mode 100644 target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
 create mode 100644 target/linux/ipq806x/patches-3.18/802-ARM-qcom-add-TP-Link-Archer-C2600-device-tree.patch
 create mode 100644 target/linux/ipq806x/patches-4.1/802-ARM-qcom-add-TP-Link-Archer-C2600-device-tree.patch
 create mode 100644 target/linux/ipq806x/profiles/tplink.mk

diff --git a/include/image.mk b/include/image.mk
index 1522dd7..ee180f4 100644
--- a/include/image.mk
+++ b/include/image.mk
@@ -327,6 +327,17 @@ define Build/netgear-dni
     mv $@.new $@
 endef
 
+define Build/tplink-safe
+    $(STAGING_DIR_HOST)/bin/tplink-safeloader \
+        -B $(TPLINK_BOARD_ID) -V OpenWrt.$(REVISION) \
+        -k $(word 1,$^) \
+        -r $(word 2,$^) \
+        -j \
+        $(if $(findstring sysupgrade,$1),-S) \
+        -o $@.new
+    mv $@.new $@
+endef
+
 define Build/fit
     $(TOPDIR)/scripts/mkits.sh \
         -D $(DEVICE_NAME) -o $@.its -k $@ \
diff --git a/target/linux/ipq806x/base-files/etc/board.d/01_leds b/target/linux/ipq806x/base-files/etc/board.d/01_leds
index 07b5b06..46070ad6 100755
--- a/target/linux/ipq806x/base-files/etc/board.d/01_leds
+++ b/target/linux/ipq806x/base-files/etc/board.d/01_leds
@@ -19,6 +19,13 @@ r7500)
     ucidef_set_led_default "wps" "WPS" "r7500:white:wps" "0"
     ucidef_set_led_default "rfkill" "rfkill" "r7500:white:rfkill" "0"
     ;;
+c2600)
+    ucidef_set_led_usbdev "usb1" "USB 1" "usb_2:blue" "2-1"
+    ucidef_set_led_usbdev "usb2" "USB 2" "usb_4:blue" "4-1"
+    ucidef_set_led_netdev "wan" "WAN" "wan:blue" "eth0"
+    ucidef_set_led_netdev "lan" "LAN" "lan:blue" "br-lan"
+    ucidef_set_led_default "general" "general" "ledgnr:blue" "1"
+    ;;
 *)
     ;;
 esac
diff --git a/target/linux/ipq806x/base-files/etc/board.d/02_network b/target/linux/ipq806x/base-files/etc/board.d/02_network
index 1302a55..9f061e4 100755
--- a/target/linux/ipq806x/base-files/etc/board.d/02_network
+++ b/target/linux/ipq806x/base-files/etc/board.d/02_network
@@ -13,7 +13,8 @@ board=$(ipq806x_board_name)
 
 case "$board" in
 ap148 |\
 d7800 |\
-r7500)
+r7500 |\
+c2600)
     ucidef_add_switch "switch0" \
         "1:lan" "2:lan" "3:lan" "4:lan" "6@eth1" "5:wan" "0@eth0"
     ;;
diff --git a/target/linux/ipq806x/base-files/lib/ipq806x.sh b/target/linux/ipq806x/base-files/lib/ipq806x.sh
index 5b27bde..262183f 100644
--- a/target/linux/ipq806x/base-files/lib/ipq806x.sh
+++ b/target/linux/ipq806x/base-files/lib/ipq806x.sh
@@ -23,6 +23,9 @@ ipq806x_board_detect() {
     *"R7500")
         name="r7500"
         ;;
+    *"C2600")
+        name="c2600"
+        ;;
     esac
 
     [ -z "$name" ] && name="unknown"
diff --git a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
index c0e19a1..7fc08bb 100644
--- a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
@@ -11,6 +11,14 @@ platform_check_image() {
         nand_do_platform_check $board $1
         return $?;
         ;;
+    c2600)
+        local magic_long="$(get_magic_long "$1")"
+        [ "$magic_long" != "27051956" ] && {
+            echo "Invalid image, bad magic: $magic_long"
+            return 1
+        }
+        return 0;
+        ;;
     *)
         return 1;
     esac
@@ -27,4 +35,28 @@ platform_pre_upgrade() {
     esac
 }
 
-# use default for platform_do_upgrade()
+platform_do_upgrade() {
+    local board=$(ipq806x_board_name)
+
+    case "$board" in
+    c2600)
+        platform_do_upgrade_c2600 "$ARGV"
+        ;;
+    esac
+}
+
+platform_do_upgrade_c2600() {
+    local kernpart="0:HLOS"
+    local rootfspart="rootfs"
+    
+    local kernel_mtd="$(find_mtd_index $kernpart)"
+    
+    local kerndev="/dev/mtd${kernel_mtd}"
+    local rootfsdev=$rootfspart
+    
+    PART_NAME="${kerndev}:${rootfsdev}"
+    MTD_CONFIG_ARGS="-s 0x200000"
+        
+    default_do_upgrade "$ARGV"
+    
+}
diff --git a/target/linux/ipq806x/image/Makefile b/target/linux/ipq806x/image/Makefile
index 14cf442..956d724 100644
--- a/target/linux/ipq806x/image/Makefile
+++ b/target/linux/ipq806x/image/Makefile
@@ -85,6 +85,19 @@ define Device/DniImage
 endef
 DEVICE_VARS += KERNEL_SIZE NETGEAR_BOARD_ID NETGEAR_HW_ID DEVICE_BLOCK_SIZE DEVICE_PAGE_SIZE
 
+define Device/TpSafeImage
+    PROFILES += $$(DEVICE_NAME)
+    FILESYSTEMS := squashfs
+    KERNEL_SUFFIX := -uImage
+    KERNEL = kernel-bin | append-dtb | uImage none
+    KERNEL_NAME := zImage
+    TPLINK_BOARD_ID :=
+    IMAGES := factory.bin sysupgrade.bin
+    IMAGE/factory.bin := tplink-safe factory
+    IMAGE/sysupgrade.bin := tplink-safe sysupgrade
+endef
+DEVICE_VARS += TPLINK_BOARD_ID
+
 define Device/AP148
     $(call Device/FitImage)
     $(call Device/UbiFit)
@@ -103,6 +116,15 @@ define Device/AP148-legacy
     BOARD_NAME := ap148
 endef
 
+define Device/C2600
+    $(call Device/TpSafeImage)
+    DEVICE_DTS := qcom-ipq8064-c2600
+    BLOCKSIZE := 128KiB
+    PAGESIZE := 2048
+    BOARD_NAME := c2600
+    TPLINK_BOARD_ID := C2600
+endef
+
 define Device/DB149
     $(call Device/FitImage)
     DEVICE_DTS := qcom-ipq8064-db149
@@ -121,6 +143,6 @@ define Device/R7500
     BOARD_NAME := r7500
 endef
 
-TARGET_DEVICES += AP148 AP148-legacy D7800 DB149 R7500
+TARGET_DEVICES += AP148 AP148-legacy C2600 D7800 DB149 R7500
 
 $(eval $(call BuildImage))
diff --git a/target/linux/ipq806x/patches-3.18/802-ARM-qcom-add-TP-Link-Archer-C2600-device-tree.patch b/target/linux/ipq806x/patches-3.18/802-ARM-qcom-add-TP-Link-Archer-C2600-device-tree.patch
new file mode 100644
index 0000000..536ae57
--- /dev/null
+++ b/target/linux/ipq806x/patches-3.18/802-ARM-qcom-add-TP-Link-Archer-C2600-device-tree.patch
@@ -0,0 +1,300 @@
+diff -urN a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
+--- a/arch/arm/boot/dts/Makefile    2015-11-25 22:51:15.148899604 +0100
++++ b/arch/arm/boot/dts/Makefile    2015-12-06 14:33:31.092396982 +0100
+@@ -362,6 +362,7 @@
+     qcom-ipq8064-db149.dtb \
+     qcom-ipq8064-r7500.dtb \
+     qcom-ipq8064-d7800.dtb \
++    qcom-ipq8064-c2600.dtb \
+     qcom-msm8660-surf.dtb \
+     qcom-msm8960-cdp.dtb \
+     qcom-msm8974-sony-xperia-honami.dtb
+diff -urN a/arch/arm/boot/dts/qcom-ipq8064-c2600.dts b/arch/arm/boot/dts/qcom-ipq8064-c2600.dts
+--- a/arch/arm/boot/dts/qcom-ipq8064-c2600.dts    1970-01-01 01:00:00.000000000 +0100
++++ b/arch/arm/boot/dts/qcom-ipq8064-c2600.dts    2015-12-06 14:20:05.152365670 +0100
+@@ -0,0 +1,285 @@
++#include "qcom-ipq8064-v1.0.dtsi"
++#include <dt-bindings/input/input.h>
++
++/ {
++    model = "TP-Link Archer C2600";
++    compatible = "tplink,c2600", "qcom,ipq8064";
++
++    memory@0 {
++        reg = <0x42000000 0x1e000000>;
++        device_type = "memory";
++    };
++
++    reserved-memory {
++        #address-cells = <1>;
++        #size-cells = <1>;
++        ranges;
++        rsvd@41200000 {
++            reg = <0x41200000 0x300000>;
++            no-map;
++        };
++    };
++
++    aliases {
++        serial0 = &uart4;
++        mdio-gpio0 = &mdio0;
++    };
++
++    chosen {
++        linux,stdout-path = "serial0:115200n8";
++    };
++
++    soc {
++        pinmux@800000 {
++            i2c4_pins: i2c4_pinmux {
++                pins = "gpio12", "gpio13";
++                function = "gsbi4";
++                bias-disable;
++            };
++
++            spi_pins: spi_pins {
++                mux {
++                    pins = "gpio18", "gpio19", "gpio21";
++                    function = "gsbi5";
++                    drive-strength = <10>;
++                    bias-none;
++                };
++            };
++
++            nand_pins: nand_pins {
++                mux {
++                    pins = "gpio34", "gpio35", "gpio36",
++                           "gpio37", "gpio38", "gpio39",
++                           "gpio40", "gpio41", "gpio42",
++                           "gpio43", "gpio44", "gpio45",
++                           "gpio46", "gpio47";
++                    function = "nand";
++                    drive-strength = <10>;
++                    bias-disable;
++                };
++
++                pullups {
++                    pins = "gpio39";
++                    bias-pull-up;
++                };
++
++                hold {
++                    pins = "gpio40", "gpio41", "gpio42",
++                           "gpio43", "gpio44", "gpio45",
++                           "gpio46", "gpio47";
++                    bias-bus-hold;
++                };
++            };
++
++            mdio0_pins: mdio0_pins {
++                mux {
++                    pins = "gpio0", "gpio1";
++                    function = "gpio";
++                    drive-strength = <8>;
++                    bias-disable;
++                };
++            };
++
++            rgmii2_pins: rgmii2_pins {
++                mux {
++                    pins = "gpio27", "gpio28", "gpio29", "gpio30", "gpio31", "gpio32",
++                           "gpio51", "gpio52", "gpio59", "gpio60", "gpio61", "gpio62" ;
++                    function = "rgmii2";
++                    drive-strength = <8>;
++                    bias-disable;
++                };
++            };
++        };
++
++        gsbi@16300000 {
++            qcom,mode = <GSBI_PROT_I2C_UART>;
++            status = "ok";
++            serial@16340000 {
++                status = "ok";
++            };
++            /*
++             * The i2c device on gsbi4 should not be enabled.
++             * On ipq806x designs gsbi4 i2c is meant for exclusive
++             * RPM usage. Turning this on in kernel manifests as
++             * i2c failure for the RPM.
++             */
++        };
++
++        gsbi5: gsbi@1a200000 {
++            qcom,mode = <GSBI_PROT_SPI>;
++            status = "ok";
++
++            spi4: spi@1a280000 {
++                status = "ok";
++                spi-max-frequency = <50000000>;
++
++                pinctrl-0 = <&spi_pins>;
++                pinctrl-names = "default";
++
++                cs-gpios = <&qcom_pinmux 20 0>;
++
++                flash: m25p80@0 {
++                    compatible = "s25fl256s1";
++                    #address-cells = <1>;
++                    #size-cells = <1>;
++                    spi-max-frequency = <50000000>;
++                    reg = <0>;
++
++                    linux,part-probe = "qcom-smem";
++                };
++            };
++        };
++
++        phy@100f8800 {        /* USB3 port 1 HS phy */
++            status = "ok";
++        };
++
++        phy@100f8830 {        /* USB3 port 1 SS phy */
++            status = "ok";
++        };
++
++        phy@110f8800 {        /* USB3 port 0 HS phy */
++            status = "ok";
++        };
++
++        phy@110f8830 {        /* USB3 port 0 SS phy */
++            status = "ok";
++        };
++
++        usb30@0 {
++            status = "ok";
++        };
++
++        usb30@1 {
++            status = "ok";
++        };
++
++        pcie0: pci@1b500000 {
++            status = "ok";
++            phy-tx0-term-offset = <7>;
++        };
++
++        pcie1: pci@1b700000 {
++            status = "ok";
++            phy-tx0-term-offset = <7>;
++        };
++
++        mdio0: mdio {
++            compatible = "virtual,mdio-gpio";
++            #address-cells = <1>;
++            #size-cells = <0>;
++            gpios = <&qcom_pinmux 1 0 &qcom_pinmux 0 0>;
++            pinctrl-0 = <&mdio0_pins>;
++            pinctrl-names = "default";
++
++            phy0: ethernet-phy@0 {
++                device_type = "ethernet-phy";
++                reg = <0>;
++                qca,ar8327-initvals = <
++                    0x00004 0x7600000   /* PAD0_MODE */
++                    0x00008 0x1000000   /* PAD5_MODE */
++                    0x0000c 0x80        /* PAD6_MODE */
++                    0x000e4 0xaa545     /* MAC_POWER_SEL */
++                    0x000e0 0xc74164de  /* SGMII_CTRL */
++                    0x0007c 0x4e        /* PORT0_STATUS */
++                    0x00094 0x4e        /* PORT6_STATUS */
++                    >;
++            };
++
++            phy4: ethernet-phy@4 {
++                device_type = "ethernet-phy";
++                reg = <4>;
++            };
++        };
++
++        gmac1: ethernet@37200000 {
++            status = "ok";
++            phy-mode = "rgmii";
++            qcom,id = <1>;
++
++            pinctrl-0 = <&rgmii2_pins>;
++            pinctrl-names = "default";
++
++            fixed-link {
++                speed = <1000>;
++                full-duplex;
++            };
++        };
++
++        gmac2: ethernet@37400000 {
++            status = "ok";
++            phy-mode = "sgmii";
++            qcom,id = <2>;
++
++            fixed-link {
++                speed = <1000>;
++                full-duplex;
++            };
++        };
++    };
++        
++    gpio-keys {
++        compatible = "gpio-keys";
++
++        wifi {
++            label = "wifi";
++            gpios = <&qcom_pinmux 49 1>;
++            linux,code = <KEY_WLAN>;
++        };
++
++        reset {
++            label = "reset";
++            gpios = <&qcom_pinmux 64 1>;
++            linux,code = <KEY_RESTART>;
++        };
++
++        wps {
++            label = "wps";
++            gpios = <&qcom_pinmux 65 1>;
++            linux,code = <KEY_WPS_BUTTON>;
++        };
++                ledgeneral {
++            label = "ledgeneral";
++            gpios = <&qcom_pinmux 16 1>;
++            linux,code = <KEY_DOLLAR>;
++        };
++    };
++
++    gpio-leds {
++        compatible = "gpio-leds";
++
++        lan {
++            label = "lan:blue";
++            gpios = <&qcom_pinmux 6 0>;
++        };
++                usb4 {
++            label = "usb_4:blue";
++            gpios = <&qcom_pinmux 7 0>;
++        };
++                usb2 {
++            label = "usb_2:blue";
++            gpios = <&qcom_pinmux 8 0>;
++        };
++                wps {
++            label = "wps:blue";
++            gpios = <&qcom_pinmux 9 0>;
++        };
++                wan_blue {
++            label = "wan:blue";
++            gpios = <&qcom_pinmux 33 1>;
++        };
++                status {
++            label = "status:blue";
++            gpios = <&qcom_pinmux 53 0>;
++            default-state = "on";
++        };
++                ledgnr {
++            label = "ledgnr:blue";
++            gpios = <&qcom_pinmux 66 0>;
++        };
++        };
++};
++
++&adm_dma {
++    status = "ok";
++};
diff --git a/target/linux/ipq806x/patches-4.1/802-ARM-qcom-add-TP-Link-Archer-C2600-device-tree.patch b/target/linux/ipq806x/patches-4.1/802-ARM-qcom-add-TP-Link-Archer-C2600-device-tree.patch
new file mode 100644
index 0000000..ada5254
--- /dev/null
+++ b/target/linux/ipq806x/patches-4.1/711-ARM-qcom-add-TP-Link-Archer-C2600-device-tree.patch
@@ -0,0 +1,300 @@
+diff -urN a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
+--- a/arch/arm/boot/dts/Makefile    2015-11-25 22:51:15.148899604 +0100
++++ b/arch/arm/boot/dts/Makefile    2015-12-06 14:33:31.092396982 +0100
+@@ -453,6 +453,7 @@
+     qcom-ipq8064-db149.dtb \
+     qcom-ipq8064-r7500.dtb \
+     qcom-ipq8064-d7800.dtb \
++    qcom-ipq8064-c2600.dtb \
+     qcom-msm8660-surf.dtb \
+     qcom-msm8960-cdp.dtb \
+     qcom-msm8974-sony-xperia-honami.dtb
+diff -urN a/arch/arm/boot/dts/qcom-ipq8064-c2600.dts b/arch/arm/boot/dts/qcom-ipq8064-c2600.dts
+--- a/arch/arm/boot/dts/qcom-ipq8064-c2600.dts    1970-01-01 01:00:00.000000000 +0100
++++ b/arch/arm/boot/dts/qcom-ipq8064-c2600.dts    2015-12-06 14:20:05.152365670 +0100
+@@ -0,0 +1,285 @@
++#include "qcom-ipq8064-v1.0.dtsi"
++#include <dt-bindings/input/input.h>
++
++/ {
++    model = "TP-Link Archer C2600";
++    compatible = "tplink,c2600", "qcom,ipq8064";
++
++    memory@0 {
++        reg = <0x42000000 0x1e000000>;
++        device_type = "memory";
++    };
++
++    reserved-memory {
++        #address-cells = <1>;
++        #size-cells = <1>;
++        ranges;
++        rsvd@41200000 {
++            reg = <0x41200000 0x300000>;
++            no-map;
++        };
++    };
++
++    aliases {
++        serial0 = &uart4;
++        mdio-gpio0 = &mdio0;
++    };
++
++    chosen {
++        linux,stdout-path = "serial0:115200n8";
++    };
++
++    soc {
++        pinmux@800000 {
++            i2c4_pins: i2c4_pinmux {
++                pins = "gpio12", "gpio13";
++                function = "gsbi4";
++                bias-disable;
++            };
++
++            spi_pins: spi_pins {
++                mux {
++                    pins = "gpio18", "gpio19", "gpio21";
++                    function = "gsbi5";
++                    drive-strength = <10>;
++                    bias-none;
++                };
++            };
++
++            nand_pins: nand_pins {
++                mux {
++                    pins = "gpio34", "gpio35", "gpio36",
++                           "gpio37", "gpio38", "gpio39",
++                           "gpio40", "gpio41", "gpio42",
++                           "gpio43", "gpio44", "gpio45",
++                           "gpio46", "gpio47";
++                    function = "nand";
++                    drive-strength = <10>;
++                    bias-disable;
++                };
++
++                pullups {
++                    pins = "gpio39";
++                    bias-pull-up;
++                };
++
++                hold {
++                    pins = "gpio40", "gpio41", "gpio42",
++                           "gpio43", "gpio44", "gpio45",
++                           "gpio46", "gpio47";
++                    bias-bus-hold;
++                };
++            };
++
++            mdio0_pins: mdio0_pins {
++                mux {
++                    pins = "gpio0", "gpio1";
++                    function = "gpio";
++                    drive-strength = <8>;
++                    bias-disable;
++                };
++            };
++
++            rgmii2_pins: rgmii2_pins {
++                mux {
++                    pins = "gpio27", "gpio28", "gpio29", "gpio30", "gpio31", "gpio32",
++                           "gpio51", "gpio52", "gpio59", "gpio60", "gpio61", "gpio62" ;
++                    function = "rgmii2";
++                    drive-strength = <8>;
++                    bias-disable;
++                };
++            };
++        };
++
++        gsbi@16300000 {
++            qcom,mode = <GSBI_PROT_I2C_UART>;
++            status = "ok";
++            serial@16340000 {
++                status = "ok";
++            };
++            /*
++             * The i2c device on gsbi4 should not be enabled.
++             * On ipq806x designs gsbi4 i2c is meant for exclusive
++             * RPM usage. Turning this on in kernel manifests as
++             * i2c failure for the RPM.
++             */
++        };
++
++        gsbi5: gsbi@1a200000 {
++            qcom,mode = <GSBI_PROT_SPI>;
++            status = "ok";
++
++            spi4: spi@1a280000 {
++                status = "ok";
++                spi-max-frequency = <50000000>;
++
++                pinctrl-0 = <&spi_pins>;
++                pinctrl-names = "default";
++
++                cs-gpios = <&qcom_pinmux 20 0>;
++
++                flash: m25p80@0 {
++                    compatible = "s25fl256s1";
++                    #address-cells = <1>;
++                    #size-cells = <1>;
++                    spi-max-frequency = <50000000>;
++                    reg = <0>;
++
++                    linux,part-probe = "qcom-smem";
++                };
++            };
++        };
++
++        phy@100f8800 {        /* USB3 port 1 HS phy */
++            status = "ok";
++        };
++
++        phy@100f8830 {        /* USB3 port 1 SS phy */
++            status = "ok";
++        };
++
++        phy@110f8800 {        /* USB3 port 0 HS phy */
++            status = "ok";
++        };
++
++        phy@110f8830 {        /* USB3 port 0 SS phy */
++            status = "ok";
++        };
++
++        usb30@0 {
++            status = "ok";
++        };
++
++        usb30@1 {
++            status = "ok";
++        };
++
++        pcie0: pci@1b500000 {
++            status = "ok";
++            phy-tx0-term-offset = <7>;
++        };
++
++        pcie1: pci@1b700000 {
++            status = "ok";
++            phy-tx0-term-offset = <7>;
++        };
++
++        mdio0: mdio {
++            compatible = "virtual,mdio-gpio";
++            #address-cells = <1>;
++            #size-cells = <0>;
++            gpios = <&qcom_pinmux 1 0 &qcom_pinmux 0 0>;
++            pinctrl-0 = <&mdio0_pins>;
++            pinctrl-names = "default";
++
++            phy0: ethernet-phy@0 {
++                device_type = "ethernet-phy";
++                reg = <0>;
++                qca,ar8327-initvals = <
++                    0x00004 0x7600000   /* PAD0_MODE */
++                    0x00008 0x1000000   /* PAD5_MODE */
++                    0x0000c 0x80        /* PAD6_MODE */
++                    0x000e4 0xaa545     /* MAC_POWER_SEL */
++                    0x000e0 0xc74164de  /* SGMII_CTRL */
++                    0x0007c 0x4e        /* PORT0_STATUS */
++                    0x00094 0x4e        /* PORT6_STATUS */
++                    >;
++            };
++
++            phy4: ethernet-phy@4 {
++                device_type = "ethernet-phy";
++                reg = <4>;
++            };
++        };
++
++        gmac1: ethernet@37200000 {
++            status = "ok";
++            phy-mode = "rgmii";
++            qcom,id = <1>;
++
++            pinctrl-0 = <&rgmii2_pins>;
++            pinctrl-names = "default";
++
++            fixed-link {
++                speed = <1000>;
++                full-duplex;
++            };
++        };
++
++        gmac2: ethernet@37400000 {
++            status = "ok";
++            phy-mode = "sgmii";
++            qcom,id = <2>;
++
++            fixed-link {
++                speed = <1000>;
++                full-duplex;
++            };
++        };
++    };
++        
++    gpio-keys {
++        compatible = "gpio-keys";
++
++        wifi {
++            label = "wifi";
++            gpios = <&qcom_pinmux 49 1>;
++            linux,code = <KEY_WLAN>;
++        };
++
++        reset {
++            label = "reset";
++            gpios = <&qcom_pinmux 64 1>;
++            linux,code = <KEY_RESTART>;
++        };
++
++        wps {
++            label = "wps";
++            gpios = <&qcom_pinmux 65 1>;
++            linux,code = <KEY_WPS_BUTTON>;
++        };
++                ledgeneral {
++            label = "ledgeneral";
++            gpios = <&qcom_pinmux 16 1>;
++            linux,code = <KEY_DOLLAR>;
++        };
++    };
++
++    gpio-leds {
++        compatible = "gpio-leds";
++
++        lan {
++            label = "lan:blue";
++            gpios = <&qcom_pinmux 6 0>;
++        };
++                usb4 {
++            label = "usb_4:blue";
++            gpios = <&qcom_pinmux 7 0>;
++        };
++                usb2 {
++            label = "usb_2:blue";
++            gpios = <&qcom_pinmux 8 0>;
++        };
++                wps {
++            label = "wps:blue";
++            gpios = <&qcom_pinmux 9 0>;
++        };
++                wan_blue {
++            label = "wan:blue";
++            gpios = <&qcom_pinmux 33 1>;
++        };
++                status {
++            label = "status:blue";
++            gpios = <&qcom_pinmux 53 0>;
++            default-state = "on";
++        };
++                ledgnr {
++            label = "ledgnr:blue";
++            gpios = <&qcom_pinmux 66 0>;
++        };
++        };
++};
++
++&adm_dma {
++    status = "ok";
++};
diff --git a/target/linux/ipq806x/profiles/tplink.mk b/target/linux/ipq806x/profiles/tplink.mk
new file mode 100644
index 0000000..d3f5a6c
--- /dev/null
+++ b/target/linux/ipq806x/profiles/tplink.mk
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2014 The Linux Foundation. All rights reserved.
+# Copyright (C) 2009 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+define Profile/C2600
+    NAME:=TP-Link Archer C2600
+    PACKAGES:= \
+        kmod-usb-core kmod-usb-ohci kmod-usb2 kmod-ledtrig-usbdev \
+        kmod-usb3 kmod-usb-dwc3-qcom kmod-usb-phy-qcom-dwc3 \
+        kmod-ath10k ath10k-firmware-qca99x0 wpad-mini
+endef
+
+define Profile/C2600/Description
+    Package set for the TP-Link Archer C2600.
+endef
+$(eval $(call Profile,C2600))
diff --git a/tools/firmware-utils/src/tplink-safeloader.c b/tools/firmware-utils/src/tplink-safeloader.c
index 77a894b..f43ffd5 100644
--- a/tools/firmware-utils/src/tplink-safeloader.c
+++ b/tools/firmware-utils/src/tplink-safeloader.c
@@ -105,6 +105,8 @@ static const uint8_t md5_salt[16] = {
 /** Vendor information for CPE210/220/510/520 */
 static const char cpe510_vendor[] = "CPE510(TP-LINK|UN|N300-5):1.0\r\n";
 
+/** Vendor information for C2600 */
+static const char c2600_vendor[] = "";
 
 /**
     The flash partition table for CPE210/220/510/520;
@@ -128,6 +130,39 @@ static const struct flash_partition_entry cpe510_partitions[] = {
 };
 
 /**
+    The flash partition table for C2600;
+    it is the same as the one used by the stock images.
+*/
+static const struct flash_partition_entry c2600_partitions[] = {
+        {"SBL1", 0x00000, 0x20000},
+        {"MIBIB", 0x20000, 0x20000},
+        {"SBL2", 0x40000, 0x20000},
+        {"SBL3", 0x60000, 0x30000},
+        {"DDRCONFIG", 0x90000, 0x10000},
+        {"SSD", 0xa0000, 0x10000},
+        {"TZ", 0xb0000, 0x30000},
+        {"RPM", 0xe0000, 0x20000},
+        {"fs-uboot", 0x100000, 0x70000},
+        {"uboot-env", 0x170000, 0x40000},
+        {"radio", 0x1b0000, 0x40000},
+        {"os-image", 0x1f0000, 0x200000},
+        {"file-system", 0x3f0000, 0x1b00000},
+        {"default-mac", 0x1ef0000, 0x00200},
+        {"pin", 0x1ef0200, 0x00200},
+        {"product-info", 0x1ef0400, 0x0fc00},
+        {"partition-table", 0x1f00000, 0x10000},
+        {"soft-version", 0x1f10000, 0x10000},
+        {"support-list", 0x1f20000, 0x10000},
+        {"profile", 0x1f30000, 0x10000},
+        {"default-config", 0x1f40000, 0x10000},
+        {"user-config", 0x1f50000, 0x40000},
+        {"qos-db", 0x1f90000, 0x40000},
+        {"usb-config", 0x1fd0000, 0x10000},
+        {"log", 0x1fe0000, 0x20000},
+    {NULL, 0, 0}
+};
+
+/**
    The support list for CPE210/220/510/520
 */
 static const char cpe510_support_list[] =
@@ -141,6 +176,13 @@ static const char cpe510_support_list[] =
     "CPE220(TP-LINK|UN|N300-2):1.0\r\n"
     "CPE220(TP-LINK|UN|N300-2):1.1\r\n";
 
+/**
+   The support list for C2600
+*/
+static const char c2600_support_list[] =
+    "SupportList:\r\n"
+    "{product_name:Archer C2600,product_ver:1.0.0,special_id:00000000}\r\n";
+        
 #define error(_ret, _errno, _str, ...)                \
     do {                            \
         fprintf(stderr, _str ": %s\n", ## __VA_ARGS__,    \
@@ -240,14 +282,14 @@ static struct image_partition_entry make_soft_version(uint32_t rev) {
 }
 
 /** Generates the support-list partition */
-static struct image_partition_entry make_support_list(const char *support_list) {
+static struct image_partition_entry make_support_list(const char *support_list, bool trailzero) {
     size_t len = strlen(support_list);
     struct image_partition_entry entry = alloc_image_partition("support-list", len + 9);
 
     put32(entry.data, len);
     memset(entry.data+4, 0, 4);
     memcpy(entry.data+8, support_list, len);
-    entry.data[len+8] = '\xff';
+    entry.data[len+8] = trailzero ? '\x00' : '\xff';
 
     return entry;
 }
@@ -436,6 +478,37 @@ static void * generate_sysupgrade_image(const struct flash_partition_entry *flas
     return image;
 }
 
+static void * generate_sysupgrade_image_c2600(const struct flash_partition_entry *flash_parts, const struct image_partition_entry *image_parts, size_t *len) {
+    const struct flash_partition_entry *flash_os_image = &flash_parts[11];
+    const struct flash_partition_entry *flash_file_system = &flash_parts[12];
+
+    const struct image_partition_entry *image_os_image = &image_parts[3];
+    const struct image_partition_entry *image_file_system = &image_parts[4];
+
+    assert(strcmp(flash_os_image->name, "os-image") == 0);
+    assert(strcmp(flash_file_system->name, "file-system") == 0);
+
+    assert(strcmp(image_os_image->name, "os-image") == 0);
+    assert(strcmp(image_file_system->name, "file-system") == 0);
+
+    if (image_os_image->size > flash_os_image->size)
+        error(1, 0, "kernel image too big (more than %u bytes)", (unsigned)flash_os_image->size);
+    if (image_file_system->size > flash_file_system->size)
+        error(1, 0, "rootfs image too big (more than %u bytes)", (unsigned)flash_file_system->size);
+
+    *len = flash_file_system->base - flash_os_image->base + image_file_system->size;
+
+    uint8_t *image = malloc(*len);
+    if (!image)
+        error(1, errno, "malloc");
+
+    memset(image, 0xff, *len);
+
+    memcpy(image, image_os_image->data, image_os_image->size);
+    memcpy(image + flash_file_system->base - flash_os_image->base, image_file_system->data, image_file_system->size);
+
+    return image;
+}
 
 /** Generates an image for CPE210/220/510/520 and writes it to a file */
 static void do_cpe510(const char *output, const char *kernel_image, const char *rootfs_image, uint32_t rev, bool add_jffs2_eof, bool sysupgrade) {
@@ -443,7 +516,7 @@ static void do_cpe510(const char *output, const char *kernel_image, const char *
 
     parts[0] = make_partition_table(cpe510_partitions);
     parts[1] = make_soft_version(rev);
-    parts[2] = make_support_list(cpe510_support_list);
+    parts[2] = make_support_list(cpe510_support_list,false);
     parts[3] = read_file("os-image", kernel_image, false);
     parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof);
 
@@ -470,6 +543,39 @@ static void do_cpe510(const char *output, const char *kernel_image, const char *
         free_image_partition(parts[i]);
 }
 
+/** Generates an image for C2600 and writes it to a file */
+static void do_c2600(const char *output, const char *kernel_image, const char *rootfs_image, uint32_t rev, bool add_jffs2_eof, bool sysupgrade) {
+    struct image_partition_entry parts[6] = {};
+
+    parts[0] = make_partition_table(c2600_partitions);
+    parts[1] = make_soft_version(rev);
+    parts[2] = make_support_list(c2600_support_list,true);
+    parts[3] = read_file("os-image", kernel_image, false);
+    parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof);
+
+    size_t len;
+    void *image;
+    if (sysupgrade)
+        image = generate_sysupgrade_image_c2600(c2600_partitions, parts, &len);
+    else
+        image = generate_factory_image(c2600_vendor, parts, &len);
+
+    FILE *file = fopen(output, "wb");
+    if (!file)
+        error(1, errno, "unable to open output file");
+
+    if (fwrite(image, len, 1, file) != 1)
+        error(1, 0, "unable to write output file");
+
+    fclose(file);
+
+    free(image);
+
+    size_t i;
+    for (i = 0; parts[i].name; i++)
+        free_image_partition(parts[i]);
+}
+
 
 /** Usage output */
 static void usage(const char *argv0) {
@@ -552,6 +658,8 @@ int main(int argc, char *argv[]) {
 
     if (strcmp(board, "CPE510") == 0)
         do_cpe510(output, kernel_image, rootfs_image, rev, add_jffs2_eof, sysupgrade);
+    else if (strcmp(board, "C2600") == 0)
+        do_c2600(output, kernel_image, rootfs_image, rev, add_jffs2_eof, sysupgrade);
     else
         error(1, 0, "unsupported board %s", board);

Is this patch complete and up to date? The ath10k stuff is partial already commited to trunk.

Everything is working fine so far except the mac address issue, which is pretty anoying. I have 6 vlans, with two ipsec tunnels bound to vti devices, multiple SSIDs with freeradius etc... But I'm experiencing a kernel panic round about every 24 hours. Sometimes the device reboots by itself, sometimes I need to reset it manually. I tried to get what's going on via a logread -f, but I don't see anything there. A serial connection would be good - did anyone make progress there? Is there anything else I can try to get at least an error message?

FWIW, I'm installing over the US firmware.

Today's project - clean out the solder in the serial port header holes, get a header on it, and try to get a serial console running.

RedVortex wrote:
Heinz wrote:

I have the same problem.
C2600 v1.1
Firmware: http://luci.subsignal.org/~trondah/c260 … actory.bin

I'm curious, what firmware from TP-Link are you using, the US or the International one ? I'm asking because, by mistake, I've installed the US one and I know it is different in some way from the International one because I cannot change the language or the country in the wireless settings anymore, it is stuck and grayed-out as United States.

Re-pushing the international one doesn't change anything, country is now fixed.

So, back to why I'm asking this: maybe we cannot install OpenWRT over the US-based firmware but it works over the International one ?

I also wonder if it is possible to re-enable the country selection, if anyone knows...

RedVortex wrote:

I'm curious, what firmware from TP-Link are you using, the US or the International one ? I'm asking because, by mistake, I've installed the US one and I know it is different in some way from the International one because I cannot change the language or the country in the wireless settings anymore, it is stuck and grayed-out as United States.

Re-pushing the international one doesn't change anything, country is now fixed.

So, back to why I'm asking this: maybe we cannot install OpenWRT over the US-based firmware but it works over the International one ?

I also wonder if it is possible to re-enable the country selection, if anyone knows...

I have firmware with fix SSH from this topic. I can change Region.

@bdheaton  did You read this post?: https://forum.openwrt.org/viewtopic.php … 16#p300116
My router does not have a chip U25. You have it?

C2600 in boot have: bootargs=console=ttyHSL1,115200n8
What is it HSL? Bluetooth?

Heinz wrote:

@bdheaton  did You read this post?: https://forum.openwrt.org/viewtopic.php … 16#p300116
My router does not have a chip U25. You have it?

C2600 in boot have: bootargs=console=ttyHSL1,115200n8
What is it HSL? Bluetooth?

Yup, read that post. I don't know that U25 is germane to serial port function. If nothing else, at least 2-3 people should try getting console working before we decide it isn't possible.

HSL1 is likely just the internal device ID for a UART on the IPQ8064 SOC. Different devices refer to on-board UARTs in different way. For example, an RPI refers to the hardware UART as /dev/ttyAMA0.

RedVortex wrote:

I'm curious, what firmware from TP-Link are you using, the US or the International one ? I'm asking because, by mistake, I've installed the US one and I know it is different in some way from the International one because I cannot change the language or the country in the wireless settings anymore, it is stuck and grayed-out as United States.

Re-pushing the international one doesn't change anything, country is now fixed.

So, back to why I'm asking this: maybe we cannot install OpenWRT over the US-based firmware but it works over the International one ?

I also wonder if it is possible to re-enable the country selection, if anyone knows...

bendavid doesn't have the US model. The firmwares are actually identical between the US and international one, at least from the actual system files. There is a partition called product_info that I believe holds the lock to US only setup. I think that if that partial is empty, it acts as the international version. If you flash the US version, then it writes the country code to that which locks it.

(Last edited by TeutonJon78 on 2 Feb 2016, 01:20)

bdheaton wrote:

Today's project - clean out the solder in the serial port header holes, get a header on it, and try to get a serial console running.

Taking a break from that project. The 2 holes closest to the board edge cleared relatively easily. The next two are being a <insert creative language here>. Given how much heat it is taking to even start to melt the solder, I'm guessing they are VCC/GND vias and likely hooked to large tracks under the black solder mask (conformal coating?).

bdheaton wrote:

The QSDK build flashed and booted fine. (MAC addresses correct and matches sticker on hardware)
Arokh's R48548 build flashed and booted fine. (MAC addresses wrong as previously noted)

I wonder what the difference is between builds that makes the MAC be correct on the QSDK builds? Anyone able to discover how they are accessing the MAC from the partition data? I think this is the only bugbear for me (and others) and then it will be awesome.

Cheers