diff mbox

[OpenWrt-Devel,1/3] ipq806x: add support for TP-Link Archer C2600 to makefiles, configs, scripts and device tree

Message ID 1451870210-5741-1-git-send-email-joshbendavid@gmail.com
State Changes Requested
Headers show

Commit Message

Josh Bendavid Jan. 4, 2016, 1:16 a.m. UTC
Add initial support for Archer C2600 to Makefiles, profiles, led/network config, and hotplug script.  Together with firmware-utils and mac80211 patches this is sufficient to build a working factory image flashable both from stock web ui and bootloader tftp recovery.  Sysupgrade is working as well. Added hotplug script is adapted from existing script for ar71xx which copies wireless calibration data from ART partition in flash to appropriate place in /lib/firmware.  The device tree file is similar to the current ap148 dts, with sata and nand removed, and buttons/led's added.

Working: Wired network, wireless (both bands), power/status/lan/wan/usb led's

Not working: wireless status led's (these are not controlled through gpio, but rather through the QCA9980 pcie chips).  Also there is no way to set the wan led to orange, which is possible in the stock firmware.  Kernel 4.1 build does not boot currently.

Not tested: Hardware buttons.

Signed-off-by: Josh Bendavid <joshbendavid@gmail.com>


---
 .../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 ++
 9 files changed, 754 insertions(+), 3 deletions(-)
 create mode 100644 target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
 create mode 100644 target/linux/ipq806x/patches-3.18/711-ARM-qcom-add-TP-Link-Archer-C2600-device-tree.patch
 create mode 100644 target/linux/ipq806x/patches-4.1/711-ARM-qcom-add-TP-Link-Archer-C2600-device-tree.patch
 create mode 100644 target/linux/ipq806x/profiles/tplink.mk

Comments

John Crispin Jan. 4, 2016, 3:15 p.m. UTC | #1
Hi,

comments inline

On 04/01/2016 02:16, Josh Bendavid wrote:
> Add initial support for Archer C2600 to Makefiles, profiles, led/network config, and hotplug script.  Together with firmware-utils and mac80211 patches this is sufficient to build a working factory image flashable both from stock web ui and bootloader tftp recovery.  Sysupgrade is working as well. Added hotplug script is adapted from existing script for ar71xx which copies wireless calibration data from ART partition in flash to appropriate place in /lib/firmware.  The device tree file is similar to the current ap148 dts, with sata and nand removed, and buttons/led's added.
> 
> Working: Wired network, wireless (both bands), power/status/lan/wan/usb led's
> 
> Not working: wireless status led's (these are not controlled through gpio, but rather through the QCA9980 pcie chips).  Also there is no way to set the wan led to orange, which is possible in the stock firmware.  Kernel 4.1 build does not boot currently.
> 
> Not tested: Hardware buttons.
> 
> Signed-off-by: Josh Bendavid <joshbendavid@gmail.com>
> 
> 
> ---
>  .../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 ++
>  9 files changed, 754 insertions(+), 3 deletions(-)
>  create mode 100644 target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
>  create mode 100644 target/linux/ipq806x/patches-3.18/711-ARM-qcom-add-TP-Link-Archer-C2600-device-tree.patch
>  create mode 100644 target/linux/ipq806x/patches-4.1/711-ARM-qcom-add-TP-Link-Archer-C2600-device-tree.patch
>  create mode 100644 target/linux/ipq806x/profiles/tplink.mk
> 
> 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"
> +	;;
> 

alphabetical ordering please


 *)
>  	;;
>  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 |\
> -r7500)
> +r7500 |\
> +c2600)


alphabetical ordering please

>  	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/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> new file mode 100644
> index 0000000..7a423de
> --- /dev/null
> +++ b/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> @@ -0,0 +1,66 @@

i missed this one before. it should really go into its own patch aswell

> +#!/bin/sh
> +
> +ath10kcal_die() {
> +	echo "ath10cal: " "$*"
> +	exit 1
> +}
> +
> +ath10kcal_from_file() {
> +	local source=$1
> +	local offset=$2
> +	local count=$3
> +
> +	dd if=$source of=/lib/firmware/$FIRMWARE bs=1 skip=$offset count=$count 2>/dev/null || \
> +		ath10kcal_die "failed to extract calibration data from $source"
> +}
> +
> +ath10kcal_extract() {
> +	local part=$1
> +	local offset=$2
> +	local count=$3
> +	local mtd
> +
> +	mtd=$(find_mtd_chardev $part)
> +	[ -n "$mtd" ] || \
> +		ath10kcal_die "no mtd device found for partition $part"
> +
> +	dd if=$mtd of=/lib/firmware/$FIRMWARE bs=1 skip=$offset count=$count 2>/dev/null || \
> +		ath10kcal_die "failed to extract calibration data from $mtd"
> +}
> +
> +ath10kcal_patch_mac() {
> +	local mac=$1
> +
> +	[ -z "$mac" ] && return
> +
> +	macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=6 count=6
> +}
> +
> +[ -e /lib/firmware/$FIRMWARE ] && exit 0
> +
> +. /lib/ipq806x.sh
> +. /lib/functions.sh
> +. /lib/functions/system.sh
> +
> +board=$(ipq806x_board_name)
> +
> +
> +case "$FIRMWARE" in
> +"ath10k/cal-pci-0000:01:00.0.bin")
> +	case $board in
> +	c2600)
> +		ath10kcal_extract "0:ART" 4096 12064
> +		;;
> +	esac
> +	;;
> +"ath10k/cal-pci-0001:01:00.0.bin")
> +	case $board in
> +	c2600)
> +		ath10kcal_extract "0:ART" 20480 12064
> +		;;
> +	esac
> +	;;
> +*)
> +	exit 1
> +	;;
> +esac
> 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


alphabetical ordering please


>  
>  	[ -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;
> +		;;

alphabetical ordering please

>  	*)
>  		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 DB149 R7500
> +TARGET_DEVICES += AP148 AP148-legacy C2600 DB149 R7500
>  
>  $(eval $(call BuildImage))
> diff --git a/target/linux/ipq806x/patches-3.18/711-ARM-qcom-add-TP-Link-Archer-C2600-device-tree.patch b/target/linux/ipq806x/patches-3.18/711-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/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
> +@@ -362,6 +362,7 @@
> + 	qcom-ipq8064-ap148.dtb \
> + 	qcom-ipq8064-db149.dtb \
> + 	qcom-ipq8064-r7500.dtb \
> ++	qcom-ipq8064-c2600.dtb \


alphabetical ordering please

> + 	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/711-ARM-qcom-add-TP-Link-Archer-C2600-device-tree.patch b/target/linux/ipq806x/patches-4.1/711-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-ap148.dtb \
> + 	qcom-ipq8064-db149.dtb \
> + 	qcom-ipq8064-r7500.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 mbox

Patch

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 |\
-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/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
new file mode 100644
index 0000000..7a423de
--- /dev/null
+++ b/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
@@ -0,0 +1,66 @@ 
+#!/bin/sh
+
+ath10kcal_die() {
+	echo "ath10cal: " "$*"
+	exit 1
+}
+
+ath10kcal_from_file() {
+	local source=$1
+	local offset=$2
+	local count=$3
+
+	dd if=$source of=/lib/firmware/$FIRMWARE bs=1 skip=$offset count=$count 2>/dev/null || \
+		ath10kcal_die "failed to extract calibration data from $source"
+}
+
+ath10kcal_extract() {
+	local part=$1
+	local offset=$2
+	local count=$3
+	local mtd
+
+	mtd=$(find_mtd_chardev $part)
+	[ -n "$mtd" ] || \
+		ath10kcal_die "no mtd device found for partition $part"
+
+	dd if=$mtd of=/lib/firmware/$FIRMWARE bs=1 skip=$offset count=$count 2>/dev/null || \
+		ath10kcal_die "failed to extract calibration data from $mtd"
+}
+
+ath10kcal_patch_mac() {
+	local mac=$1
+
+	[ -z "$mac" ] && return
+
+	macaddr_2bin $mac | dd of=/lib/firmware/$FIRMWARE conv=notrunc bs=1 seek=6 count=6
+}
+
+[ -e /lib/firmware/$FIRMWARE ] && exit 0
+
+. /lib/ipq806x.sh
+. /lib/functions.sh
+. /lib/functions/system.sh
+
+board=$(ipq806x_board_name)
+
+
+case "$FIRMWARE" in
+"ath10k/cal-pci-0000:01:00.0.bin")
+	case $board in
+	c2600)
+		ath10kcal_extract "0:ART" 4096 12064
+		;;
+	esac
+	;;
+"ath10k/cal-pci-0001:01:00.0.bin")
+	case $board in
+	c2600)
+		ath10kcal_extract "0:ART" 20480 12064
+		;;
+	esac
+	;;
+*)
+	exit 1
+	;;
+esac
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 DB149 R7500
+TARGET_DEVICES += AP148 AP148-legacy C2600 DB149 R7500
 
 $(eval $(call BuildImage))
diff --git a/target/linux/ipq806x/patches-3.18/711-ARM-qcom-add-TP-Link-Archer-C2600-device-tree.patch b/target/linux/ipq806x/patches-3.18/711-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/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
+@@ -362,6 +362,7 @@
+ 	qcom-ipq8064-ap148.dtb \
+ 	qcom-ipq8064-db149.dtb \
+ 	qcom-ipq8064-r7500.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/711-ARM-qcom-add-TP-Link-Archer-C2600-device-tree.patch b/target/linux/ipq806x/patches-4.1/711-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-ap148.dtb \
+ 	qcom-ipq8064-db149.dtb \
+ 	qcom-ipq8064-r7500.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))