diff mbox series

ipq806x: add support for TP-Link Talon AD7200

Message ID 20201011230933.24457-1-fercerpav@gmail.com
State Changes Requested
Headers show
Series ipq806x: add support for TP-Link Talon AD7200 | expand

Commit Message

Paul Fertser Oct. 11, 2020, 11:09 p.m. UTC
From: Gary Cooper <gaco@mail2tor.com>

Device hardware: https://deviwiki.com/wiki/TP-LINK_AD7200_(Talon)

The Talon AD7200 is basically an Archer C2600 with larger flash, a third PCIe lane and an 802.11ad radio. It comes in a different housing reminiscent of the Archers C3200 and C5400.


Specifications
--------------

  - IPQ8064 dual-core 1400MHz
  - QCA9988 2.4GHz WiFi
  - QCA9888 5GHz WiFi
  - QCA9500 60GHz WiFi
  - 256MiB SPI Flash
  - 512MiB RAM
  - 5 GBit Ports (QCA8337)

Installation
------------

Installation is possible from the OEM web interface.
Sysupgrade is possible.
TFTP recovery is possible.
  - Image: AD7200_1.0_tp_recovery.bin

Notes
  - This will be the first 802.11ad device supported by mainline.
  
Signed-off-by: Gary Cooper <gaco@mail2tor.com>
---
 package/base-files/files/sbin/wifi            |   1 +
 package/firmware/linux-firmware/qca.mk        |   8 +
 package/kernel/mac80211/ath.mk                |  13 +-
 .../mac80211/files/lib/wifi/mac80211.sh       |   6 +
 .../network/services/hostapd/files/hostapd.sh |   8 +
 .../ipq806x/base-files/etc/board.d/01_leds    |   9 +
 .../ipq806x/base-files/etc/board.d/02_network |   4 +
 .../etc/hotplug.d/firmware/11-ath10k-caldata  |   2 +
 .../base-files/lib/upgrade/platform.sh        |   1 +
 .../arch/arm/boot/dts/qcom-ipq8064-ad7200.dts | 440 ++++++++++++++++++
 target/linux/ipq806x/image/Makefile           |  15 +
 tools/firmware-utils/src/tplink-safeloader.c  |  44 ++
 12 files changed, 550 insertions(+), 1 deletion(-)
 create mode 100644 target/linux/ipq806x/files-5.4/arch/arm/boot/dts/qcom-ipq8064-ad7200.dts

Comments

Ansuel Smith Oct. 11, 2020, 11:18 p.m. UTC | #1
>
> From: Gary Cooper <gaco@mail2tor.com>
>
> Device hardware: https://deviwiki.com/wiki/TP-LINK_AD7200_(Talon)
>
> The Talon AD7200 is basically an Archer C2600 with larger flash, a third PCIe lane and an 802.11ad radio. It comes in a different housing reminiscent of the Archers C3200 and C5400.
>
>
> Specifications
> --------------
>
>   - IPQ8064 dual-core 1400MHz
>   - QCA9988 2.4GHz WiFi
>   - QCA9888 5GHz WiFi
>   - QCA9500 60GHz WiFi
>   - 256MiB SPI Flash
>   - 512MiB RAM
>   - 5 GBit Ports (QCA8337)
>
> Installation
> ------------
>
> Installation is possible from the OEM web interface.
> Sysupgrade is possible.
> TFTP recovery is possible.
>   - Image: AD7200_1.0_tp_recovery.bin
>
> Notes
>   - This will be the first 802.11ad device supported by mainline.

Incredible that they chose ipq8064 for wifi ad and not the more recent soc...
Daniel Golle Oct. 11, 2020, 11:43 p.m. UTC | #2
On Mon, Oct 12, 2020 at 02:09:32AM +0300, Paul Fertser wrote:
> From: Gary Cooper <gaco@mail2tor.com>
> 
> Device hardware: https://deviwiki.com/wiki/TP-LINK_AD7200_(Talon)
> 
> The Talon AD7200 is basically an Archer C2600 with larger flash, a third PCIe lane and an 802.11ad radio. It comes in a different housing reminiscent of the Archers C3200 and C5400.
> 
> 
> Specifications
> --------------
> 
>   - IPQ8064 dual-core 1400MHz
>   - QCA9988 2.4GHz WiFi
>   - QCA9888 5GHz WiFi
>   - QCA9500 60GHz WiFi
>   - 256MiB SPI Flash

That should be 256Mb or 32MiB
(according to the flash partition table in DTS)

>   - 512MiB RAM
>   - 5 GBit Ports (QCA8337)
> 
> Installation
> ------------
> 
> Installation is possible from the OEM web interface.
> Sysupgrade is possible.
> TFTP recovery is possible.
>   - Image: AD7200_1.0_tp_recovery.bin
> 
> Notes
>   - This will be the first 802.11ad device supported by mainline.

It'd be great to split this into a generic part adding 802.11ad
features to mac80211.sh and hostapd.sh, and another commit only
adding the device itself.


>   
> Signed-off-by: Gary Cooper <gaco@mail2tor.com>
> ---
>  package/base-files/files/sbin/wifi            |   1 +
>  package/firmware/linux-firmware/qca.mk        |   8 +
>  package/kernel/mac80211/ath.mk                |  13 +-
>  .../mac80211/files/lib/wifi/mac80211.sh       |   6 +
>  .../network/services/hostapd/files/hostapd.sh |   8 +
>  .../ipq806x/base-files/etc/board.d/01_leds    |   9 +
>  .../ipq806x/base-files/etc/board.d/02_network |   4 +
>  .../etc/hotplug.d/firmware/11-ath10k-caldata  |   2 +
>  .../base-files/lib/upgrade/platform.sh        |   1 +
>  .../arch/arm/boot/dts/qcom-ipq8064-ad7200.dts | 440 ++++++++++++++++++
>  target/linux/ipq806x/image/Makefile           |  15 +
>  tools/firmware-utils/src/tplink-safeloader.c  |  44 ++
>  12 files changed, 550 insertions(+), 1 deletion(-)
>  create mode 100644 target/linux/ipq806x/files-5.4/arch/arm/boot/dts/qcom-ipq8064-ad7200.dts
> 
> diff --git a/package/base-files/files/sbin/wifi b/package/base-files/files/sbin/wifi
> index a8b4451c60..75759b94f3 100755
> --- a/package/base-files/files/sbin/wifi
> +++ b/package/base-files/files/sbin/wifi
> @@ -79,6 +79,7 @@ wifi_fixup_hwmode() {
>  	case "$hwmode" in
>  		11bg) hwmode=bg;;
>  		11a) hwmode=a;;
> +		11ad) hwmode=ad;;
>  		11b) hwmode=b;;
>  		11g) hwmode=g;;
>  		11n*)
> diff --git a/package/firmware/linux-firmware/qca.mk b/package/firmware/linux-firmware/qca.mk
> index 23fcc0905a..71b484d5c7 100644
> --- a/package/firmware/linux-firmware/qca.mk
> +++ b/package/firmware/linux-firmware/qca.mk
> @@ -37,3 +37,11 @@ define Package/carl9170-firmware/install
>  	$(INSTALL_DATA) $(PKG_BUILD_DIR)/carl9170-1.fw $(1)/lib/firmware
>  endef
>  $(eval $(call BuildPackage,carl9170-firmware))
> +
> +Package/wil6210-firmware = $(call Package/firmware-default,wil6210 firmware)
> +define Package/wil6210-firmware/install
> +	$(INSTALL_DIR) $(1)/lib/firmware
> +	$(INSTALL_DATA) $(PKG_BUILD_DIR)/wil6210.fw $(1)/lib/firmware
> +	$(INSTALL_DATA) $(PKG_BUILD_DIR)/wil6210.brd $(1)/lib/firmware
> +endef
> +$(eval $(call BuildPackage,wil6210-firmware))
> diff --git a/package/kernel/mac80211/ath.mk b/package/kernel/mac80211/ath.mk
> index 5db4be8daa..e563fb71fc 100644
> --- a/package/kernel/mac80211/ath.mk
> +++ b/package/kernel/mac80211/ath.mk
> @@ -1,6 +1,6 @@
>  PKG_DRIVERS += \
>  	ath ath5k ath6kl ath6kl-sdio ath6kl-usb ath9k ath9k-common ath9k-htc ath10k \
> -	carl9170 owl-loader ar5523
> +	carl9170 wil6210 owl-loader ar5523
>  
>  PKG_CONFIG_DEPENDS += \
>  	CONFIG_PACKAGE_ATH_DEBUG \
> @@ -20,6 +20,7 @@ ifdef CONFIG_PACKAGE_MAC80211_DEBUGFS
>  	ATH9K_HTC_DEBUGFS \
>  	ATH10K_DEBUGFS \
>  	CARL9170_DEBUGFS \
> +	WIL6210_DEBUGFS \
>  	ATH5K_DEBUG \
>  	ATH6KL_DEBUG
>  endif
> @@ -29,6 +30,7 @@ ifdef CONFIG_PACKAGE_MAC80211_TRACING
>  	ATH10K_TRACING \
>  	ATH6KL_TRACING \
>  	ATH_TRACEPOINTS \
> +	WIL6210_TRACING
>  	ATH5K_TRACER
>  endif
>  
> @@ -66,6 +68,7 @@ config-$(call config_package,ath6kl-sdio) += ATH6KL_SDIO
>  config-$(call config_package,ath6kl-usb) += ATH6KL_USB
>  
>  config-$(call config_package,carl9170) += CARL9170
> +config-$(call config_package,wil6210) += WIL6210
>  config-$(call config_package,ar5523) += AR5523
>  
>  define KernelPackage/ath/config
> @@ -284,6 +287,14 @@ define KernelPackage/carl9170
>    AUTOLOAD:=$(call AutoProbe,carl9170)
>  endef
>  
> +define KernelPackage/wil6210
> +  $(call KernelPackage/mac80211/Default)
> +  TITLE:=QCA/Wilocity 60g WiFi card wil6210 support
> +  DEPENDS+= @PCI_SUPPORT +kmod-mac80211 +wil6210-firmware
> +  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/wil6210/wil6210.ko
> +  AUTOLOAD:=$(call AutoProbe,wil6210)
> +endef
> +
>  define KernelPackage/owl-loader
>    $(call KernelPackage/mac80211/Default)
>    TITLE:=Owl loader for initializing Atheros PCI(e) Wifi chips
> diff --git a/package/kernel/mac80211/files/lib/wifi/mac80211.sh b/package/kernel/mac80211/files/lib/wifi/mac80211.sh
> index c0fbfbe5a8..3e99f06693 100644
> --- a/package/kernel/mac80211/files/lib/wifi/mac80211.sh
> +++ b/package/kernel/mac80211/files/lib/wifi/mac80211.sh
> @@ -88,6 +88,12 @@ detect_mac80211() {
>  			iw phy "$dev" info | grep -q 'VHT Capabilities' && htmode="VHT80"
>  		}
>  
> +		iw phy "$dev" info | grep -q '\* 5.... MHz \[' && {
> +			mode_band="ad"
> +			channel=$(iw phy "$dev" info | grep '\* 5.... MHz \[' | grep '(disabled)' -v -m 1 | sed 's/[^[]*\[\|\|\].*//g')
> +			iw phy "$dev" info | grep -q 'Capabilities:' && htmode="HT20"
> +		}
> +
>  		[ -n "$htmode" ] && ht_capab="set wireless.radio${devidx}.htmode=$htmode"
>  
>  		path="$(mac80211_phy_to_path "$dev")"
> diff --git a/package/network/services/hostapd/files/hostapd.sh b/package/network/services/hostapd/files/hostapd.sh
> index 3290358ed2..b5563d88a6 100644
> --- a/package/network/services/hostapd/files/hostapd.sh
> +++ b/package/network/services/hostapd/files/hostapd.sh
> @@ -1163,6 +1163,14 @@ wpa_supplicant_add_network() {
>  		;;
>  	esac
>  
> +	case "$wpa_cipher" in
> +		GCMP)
> +			append network_data "pairwise=GCMP" "$N$T"
> +			append network_data "group=GCMP" "$N$T"
> +		;;
> +		*) ;;
> +	esac
> +
>  	[ "$mode" = mesh ] || {
>  		case "$wpa" in
>  			1)
> 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 c23f25540b..7af06fd3ee 100755
> --- a/target/linux/ipq806x/base-files/etc/board.d/01_leds
> +++ b/target/linux/ipq806x/base-files/etc/board.d/01_leds
> @@ -36,6 +36,15 @@ netgear,r7800)
>  	ucidef_set_led_switch "wan" "WAN" "white:wan" "switch0" "0x20"
>  	ucidef_set_led_ide "esata" "eSATA" "white:esata"
>  	;;
> +tplink,ad7200)
> +	ucidef_set_led_usbport "usb1" "USB 1" "blue:usb_1" "usb1-port1" "usb2-port1"
> +	ucidef_set_led_usbport "usb2" "USB 2" "blue:usb_3" "usb3-port1" "usb4-port1"
> +	ucidef_set_led_switch "wan" "wan" "blue:wan" "switch0" "0x02"
> +	ucidef_set_led_switch "lan" "lan" "blue:lan" "switch0" "0x3c"
> +	ucidef_set_led_wlan "wlan2g" "wlan2g" "blue:wlan2g" "phy2tpt"
> +	ucidef_set_led_wlan "wlan5g" "wlan5g" "blue:wlan5g" "phy1tpt"
> +	ucidef_set_led_netdev "wlan60g" "wlan60g" "blue:wlan60g" "phy0tpt"
> +	;;
>  tplink,c2600)
>  	ucidef_set_led_usbport "usb1" "USB 1" "white:usb_2" "usb1-port1" "usb2-port1"
>  	ucidef_set_led_usbport "usb2" "USB 2" "white:usb_4" "usb3-port1" "usb4-port1"
> 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 3f9d96881d..d013f114b4 100755
> --- a/target/linux/ipq806x/base-files/etc/board.d/02_network
> +++ b/target/linux/ipq806x/base-files/etc/board.d/02_network
> @@ -50,6 +50,10 @@ tplink,c2600)
>  	ucidef_add_switch "switch0" \
>  		"1:lan:4" "2:lan:3" "3:lan:2" "4:lan:1" "6@eth1" "5:wan" "0@eth0"
>  	;;
> +tplink,ad7200)
> +	ucidef_add_switch "switch0" \
> +		"2:lan" "3:lan" "4:lan" "5:lan" "6@eth1" "1:wan" "0@eth0"
> +	;;
>  qcom,ipq8064-ap161)
>  	ucidef_set_interface_lan "eth1 eth2"
>  	ucidef_add_switch "switch0" \
> 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
> index 74ad00c5ce..5a19d30538 100644
> --- 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
> @@ -31,6 +31,7 @@ case "$FIRMWARE" in
>  		caldata_extract "art" 0x1000 0x2f20
>  		ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary art 0x6) +1)
>  		;;
> +	tplink,ad7200 |\
>  	tplink,c2600)
>  		caldata_extract "radio" 0x1000 0x2f20
>  		ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary default-mac 0x8) -1)
> @@ -66,6 +67,7 @@ case "$FIRMWARE" in
>  		caldata_extract "art" 0x5000 0x2f20
>  		ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary art 0x6) +2)
>  		;;
> +	tplink,ad7200 |\
>  	tplink,c2600)
>  		caldata_extract "radio" 0x5000 0x2f20
>  		ath10k_patch_mac $(mtd_get_mac_binary default-mac 0x8)
> diff --git a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
> index f61e8ee878..a20d1bbd5b 100644
> --- a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
> +++ b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
> @@ -39,6 +39,7 @@ platform_do_upgrade() {
>  	linksys,ea8500)
>  		platform_do_upgrade_linksys "$1"
>  		;;
> +	tplink,ad7200 |\
>  	tplink,c2600)
>  		PART_NAME="os-image:rootfs"
>  		MTD_CONFIG_ARGS="-s 0x200000"
> diff --git a/target/linux/ipq806x/files-5.4/arch/arm/boot/dts/qcom-ipq8064-ad7200.dts b/target/linux/ipq806x/files-5.4/arch/arm/boot/dts/qcom-ipq8064-ad7200.dts
> new file mode 100644
> index 0000000000..14ed8b49cc
> --- /dev/null
> +++ b/target/linux/ipq806x/files-5.4/arch/arm/boot/dts/qcom-ipq8064-ad7200.dts
> @@ -0,0 +1,440 @@
> +SPDX-License-Identifier: GPL-2.0-or-later OR MIT
> +#include "qcom-ipq8064-v2.0.dtsi"
> +
> +#include <dt-bindings/input/input.h>
> +
> +/ {
> +	model = "TP-Link Talon AD7200";
> +	compatible = "tplink,ad7200", "qcom,ipq8064";
> +
> +	memory@0 {
> +		reg = <0x42000000 0x1e000000>;
> +		device_type = "memory";
> +	};
> +
> +	aliases {
> +		mdio-gpio0 = &mdio0;
> +
> +		led-boot = &power;
> +		led-failsafe = &power;
> +		led-running = &power;
> +		led-upgrade = &power;
> +		label-mac-device = &gmac2;
> +	};
> +
> +	keys {
> +		compatible = "gpio-keys";
> +		pinctrl-0 = <&button_pins>;
> +		pinctrl-names = "default";
> +
> +		wifi {
> +			label = "wifi";
> +			gpios = <&qcom_pinmux 54 GPIO_ACTIVE_LOW>;
> +			linux,code = <KEY_RFKILL>;
> +		};
> +
> +		reset {
> +			label = "reset";
> +			gpios = <&qcom_pinmux 7 GPIO_ACTIVE_LOW>;
> +			linux,code = <KEY_RESTART>;
> +		};
> +
> +		wps {
> +			label = "wps";
> +			gpios = <&qcom_pinmux 67 GPIO_ACTIVE_LOW>;
> +			linux,code = <KEY_WPS_BUTTON>;
> +		};
> +
> +		ledgeneral {
> +			label = "ledswitch";
> +			gpios = <&qcom_pinmux 53 GPIO_ACTIVE_LOW>;
> +			linux,code = <KEY_LIGHTS_TOGGLE>;
> +		};
> +	};
> +
> +	leds {
> +		compatible = "gpio-leds";
> +		pinctrl-0 = <&led_pins>;
> +		pinctrl-names = "default";
> +
> +		lan {
> +			label = "blue:lan";
> +			gpios = <&qcom_pinmux 2 GPIO_ACTIVE_HIGH>;
> +		};
> +
> +		usb1 {
> +			label = "blue:usb_1";
> +			gpios = <&qcom_pinmux 8 GPIO_ACTIVE_HIGH>;
> +		};
> +
> +		usb3 {
> +			label = "blue:usb_3";
> +			gpios = <&qcom_pinmux 16 GPIO_ACTIVE_HIGH>;
> +		};
> +
> +		wps {
> +			label = "blue:wps";
> +			gpios = <&qcom_pinmux 55 GPIO_ACTIVE_HIGH>;
> +		};
> +
> +		wan_orange {
> +			label = "orange:wan";
> +			gpios = <&qcom_pinmux 26 GPIO_ACTIVE_LOW>;
> +		};
> +
> +		wan_blue {
> +			label = "blue:wan";
> +			gpios = <&qcom_pinmux 33 GPIO_ACTIVE_LOW>;
> +		};
> +
> +		power: status {
> +			label = "blue:status";
> +			gpios = <&qcom_pinmux 66 GPIO_ACTIVE_HIGH>;
> +		};
> +
> +		wlan2g {
> +			label = "blue:wlan2g";
> +			gpios = <&qcom_pinmux 17 GPIO_ACTIVE_HIGH>;
> +
> +		};
> +
> +		wlan5g {
> +			label = "blue:wlan5g";
> +			gpios = <&qcom_pinmux 15 GPIO_ACTIVE_HIGH>;
> +
> +		};
> +
> +		wlan60g {
> +			label = "blue:wlan60g";
> +			gpios = <&qcom_pinmux 56 GPIO_ACTIVE_HIGH>;
> +		};
> +	};
> +};
> +
> +&qcom_pinmux {
> +	button_pins: button_pins {
> +		mux {
> +			pins = "gpio53", "gpio54", "gpio67";
> +			function = "gpio";
> +			drive-strength = <2>;
> +			bias-pull-up;
> +		};
> +	};
> +
> +	led_pins: led_pins {
> +		mux {
> +			pins = "gpio2", "gpio8", "gpio15", "gpio16", "gpio17", "gpio26",
> +					"gpio33", "gpio55", "gpio56", "gpio66";
> +			function = "gpio";
> +			drive-strength = <2>;
> +			bias-pull-up;
> +		};
> +	};
> +
> +	spi_pins: spi_pins {
> +		mux {
> +			pins = "gpio18", "gpio19", "gpio21";
> +			function = "gsbi5";
> +			bias-pull-down;
> +		};
> +
> +		data {
> +			pins = "gpio18", "gpio19";
> +			drive-strength = <10>;
> +		};
> +
> +		cs {
> +			pins = "gpio20";
> +			function = "gpio";
> +			drive-strength = <10>;
> +			bias-pull-up;
> +		};
> +
> +		clk {
> +			pins = "gpio21";
> +			drive-strength = <12>;
> +		};
> +	};
> +
> +	usb0_pwr_en_pin: usb0_pwr_en_pin {
> +		mux {
> +			pins = "gpio25";
> +			function = "gpio";
> +			drive-strength = <10>;
> +			bias-pull-up;
> +			output-high;
> +		};
> +	};
> +
> +	usb1_pwr_en_pin: usb1_pwr_en_pin {
> +		mux {
> +			pins = "gpio23";
> +			function = "gpio";
> +			drive-strength = <10>;
> +			bias-pull-up;
> +			output-high;
> +		};
> +	};
> +};
> +
> +&gsbi5 {
> +	qcom,mode = <GSBI_PROT_SPI>;
> +	status = "okay";
> +
> +	spi4: spi@1a280000 {
> +		status = "okay";
> +
> +		pinctrl-0 = <&spi_pins>;
> +		pinctrl-names = "default";
> +
> +		cs-gpios = <&qcom_pinmux 20 GPIO_ACTIVE_HIGH>;
> +
> +		m25p80@0 {
> +			compatible = "jedec,spi-nor";
> +			#address-cells = <1>;
> +			#size-cells = <1>;
> +			spi-max-frequency = <50000000>;
> +			reg = <0>;
> +
> +			SBL1@0 {
> +				label = "SBL1";
> +				reg = <0x0 0x20000>;
> +				read-only;
> +			};
> +
> +			MIBIB@20000 {
> +				label = "MIBIB";
> +				reg = <0x20000 0x20000>;
> +				read-only;
> +			};
> +
> +			SBL2@40000 {
> +				label = "SBL2";
> +				reg = <0x40000 0x20000>;
> +				read-only;
> +			};
> +
> +			SBL3@60000 {
> +				label = "SBL3";
> +				reg = <0x60000 0x30000>;
> +				read-only;
> +			};
> +
> +			DDRCONFIG@90000 {
> +				label = "DDRCONFIG";
> +				reg = <0x90000 0x10000>;
> +				read-only;
> +			};
> +
> +			SSD@a0000 {
> +				label = "SSD";
> +				reg = <0xa0000 0x10000>;
> +				read-only;
> +			};
> +
> +			TZ@b0000 {
> +				label = "TZ";
> +				reg = <0xb0000 0x30000>;
> +				read-only;
> +			};
> +
> +			RPM@e0000 {
> +				label = "RPM";
> +				reg = <0xe0000 0x20000>;
> +				read-only;
> +			};
> +
> +			fs-uboot@100000 {
> +				label = "fs-uboot";
> +				reg = <0x100000 0x70000>;
> +				read-only;
> +			};
> +
> +			uboot-env@170000 {
> +				label = "uboot-env";
> +				reg = <0x170000 0x40000>;
> +				read-only;
> +			};
> +
> +			radio@1b0000 {
> +				label = "radio";
> +				reg = <0x1b0000 0x40000>;
> +				read-only;
> +			};
> +
> +			os-image@1f0000 {
> +				label = "os-image";
> +				reg = <0x1f0000 0x400000>;
> +			};
> +
> +			rootfs@5f0000 {
> +				label = "rootfs";
> +				reg = <0x5f0000 0x1900000>;
> +			};
> +
> +			defaultmac: default-mac@1ef0000 {
> +				label = "default-mac";
> +				reg = <0x1ef0000 0x00200>;
> +				read-only;
> +			};
> +
> +			pin@1ef0200 {
> +				label = "pin";
> +				reg = <0x1ef0200 0x00200>;
> +				read-only;
> +			};
> +
> +			device-id@1ef0400 {
> +				label = "device-id";
> +				reg = <0x1ef0400 0x00200>;
> +				read-only;
> +			};
> +
> +			product-info@1ef0600 {
> +				label = "product-info";
> +				reg = <0x1ef0600 0x0fa00>;
> +				read-only;
> +			};
> +
> +			partition-table@1f00000 {
> +				label = "partition-table";
> +				reg = <0x1f00000 0x10000>;
> +				read-only;
> +			};
> +
> +			soft-version@1f10000 {
> +				label = "soft-version";
> +				reg = <0x1f10000 0x10000>;
> +				read-only;
> +			};
> +
> +			support-list@1f20000 {
> +				label = "support-list";
> +				reg = <0x1f20000 0x10000>;
> +				read-only;
> +			};
> +
> +			profile@1f30000 {
> +				label = "profile";
> +				reg = <0x1f30000 0x10000>;
> +				read-only;
> +			};
> +
> +			default-config@1f40000 {
> +				label = "default-config";
> +				reg = <0x1f40000 0x10000>;
> +				read-only;
> +			};
> +
> +			user-config@1f50000 {
> +				label = "user-config";
> +				reg = <0x1f50000 0x40000>;
> +				read-only;
> +			};
> +
> +			qos-db@1f90000 {
> +				label = "qos-db";
> +				reg = <0x1f90000 0x40000>;
> +				read-only;
> +			};
> +
> +			usb-config@1fd0000 {
> +				label = "usb-config";
> +				reg = <0x1fd0000 0x10000>;
> +				read-only;
> +			};
> +
> +			log@1fe0000 {
> +				label = "log";
> +				reg = <0x1fe0000 0x20000>;
> +				read-only;
> +			};
> +		};
> +	};
> +};
> +
> +&usb3_0 {
> +	status = "okay";
> +
> +	pinctrl-0 = <&usb0_pwr_en_pin>;
> +	pinctrl-names = "default";
> +};
> +
> +&usb3_1 {
> +	status = "okay";
> +
> +	pinctrl-0 = <&usb1_pwr_en_pin>;
> +	pinctrl-names = "default";
> +};
> +
> +&pcie0 {
> +	status = "okay";
> +};
> +
> +&pcie1 {
> +	status = "okay";
> +	max-link-speed = <1>;
> +};
> +
> +&pcie2 {
> +	status = "okay";
> +	max-link-speed = <1>;
> +};
> +
> +&mdio0 {
> +	status = "okay";
> +
> +	pinctrl-0 = <&mdio0_pins>;
> +	pinctrl-names = "default";
> +
> +	phy0: ethernet-phy@0 {
> +		reg = <0>;
> +		qca,ar8327-initvals = <
> +			0x00004 0x7600000   /* PAD0_MODE */
> +			0x00008 0x1000000   /* PAD5_MODE */
> +			0x0000c 0x80        /* PAD6_MODE */
> +			0x000e4 0x6a545     /* MAC_POWER_SEL */
> +			0x000e0 0xc74164de  /* SGMII_CTRL */
> +			0x0007c 0x4e        /* PORT0_STATUS */
> +			0x00094 0x4e        /* PORT6_STATUS */
> +			>;
> +	};
> +
> +	phy4: ethernet-phy@4 {
> +		reg = <4>;
> +	};
> +};
> +
> +&gmac1 {
> +	status = "okay";
> +	phy-mode = "rgmii";
> +	qcom,id = <1>;
> +
> +	pinctrl-0 = <&rgmii2_pins>;
> +	pinctrl-names = "default";
> +
> +	mtd-mac-address = <&defaultmac 0x8>;
> +	mtd-mac-address-increment = <1>;
> +
> +	fixed-link {
> +		speed = <1000>;
> +		full-duplex;
> +	};
> +};
> +
> +&gmac2 {
> +	status = "okay";
> +	phy-mode = "sgmii";
> +	qcom,id = <2>;
> +
> +	mtd-mac-address = <&defaultmac 0x8>;
> +
> +	fixed-link {
> +		speed = <1000>;
> +		full-duplex;
> +	};
> +};
> +
> +&adm_dma {
> +	status = "okay";
> +};
> diff --git a/target/linux/ipq806x/image/Makefile b/target/linux/ipq806x/image/Makefile
> index ec73630ae5..6e3ef6f526 100644
> --- a/target/linux/ipq806x/image/Makefile
> +++ b/target/linux/ipq806x/image/Makefile
> @@ -295,6 +295,21 @@ define Device/qcom_ipq8064-db149
>  endef
>  TARGET_DEVICES += qcom_ipq8064-db149
>  
> +define Device/tplink_ad7200
> +	$(call Device/TpSafeImage)
> +	DEVICE_VENDOR := TP-Link
> +	DEVICE_MODEL := Talon AD7200
> +	DEVICE_VARIANT := v1
> +	SOC := qcom-ipq8064
> +	BLOCKSIZE := 128k
> +	PAGESIZE := 2048
> +	BOARD_NAME := ad7200
> +	SUPPORTED_DEVICES += ad7200
> +	TPLINK_BOARD_ID := AD7200
> +	DEVICE_PACKAGES := ath10k-firmware-qca99x0-ct kmod-wil6210
> +endef
> +TARGET_DEVICES += tplink_ad7200
> +
>  define Device/tplink_c2600
>  	$(call Device/TpSafeImage)
>  	DEVICE_VENDOR := TP-Link
> diff --git a/tools/firmware-utils/src/tplink-safeloader.c b/tools/firmware-utils/src/tplink-safeloader.c
> index 31b9c032d1..08f96a5fa8 100644
> --- a/tools/firmware-utils/src/tplink-safeloader.c
> +++ b/tools/firmware-utils/src/tplink-safeloader.c
> @@ -651,6 +651,50 @@ static struct device_info boards[] = {
>  		.last_sysupgrade_partition = "support-list",
>  	},
>  
> +	/** Firmware layout for the AD7200 */
> +	{
> +		.id = "AD7200",
> +		.vendor = "",
> +		.support_list =
> +			"SupportList:\r\n"
> +			"{product_name:Talon AD7200,product_ver:1.0.0,special_id:00000000}\r\n",
> +		.support_trail = '\x00',
> +		.soft_ver = NULL,
> +
> +		.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, 0x400000},
> +			{"file-system", 0x5f0000, 0x1900000},
> +			{"default-mac", 0x1ef0000, 0x00200},
> +			{"pin", 0x1ef0200, 0x00200},
> +			{"device-id", 0x1ef0400, 0x00200},
> +			{"product-info", 0x1ef0600, 0x0fa00},
> +			{"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}
> +		},
> +
> +		.first_sysupgrade_partition = "os-image",
> +		.last_sysupgrade_partition = "file-system"
> +	},
> +
>  	/** Firmware layout for the C2600 */
>  	{
>  		.id     = "C2600",
> -- 
> 2.17.1
> 
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel@lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel
Robert Marko Oct. 12, 2020, 7:52 a.m. UTC | #3
On Mon, 12 Oct 2020 at 01:21, Ansuel Smith <ansuelsmth@gmail.com> wrote:
>
> >
> > From: Gary Cooper <gaco@mail2tor.com>
> >
> > Device hardware: https://deviwiki.com/wiki/TP-LINK_AD7200_(Talon)
> >
> > The Talon AD7200 is basically an Archer C2600 with larger flash, a third PCIe lane and an 802.11ad radio. It comes in a different housing reminiscent of the Archers C3200 and C5400.
> >
> >
> > Specifications
> > --------------
> >
> >   - IPQ8064 dual-core 1400MHz
> >   - QCA9988 2.4GHz WiFi
> >   - QCA9888 5GHz WiFi
> >   - QCA9500 60GHz WiFi
> >   - 256MiB SPI Flash
> >   - 512MiB RAM
> >   - 5 GBit Ports (QCA8337)
> >
> > Installation
> > ------------
> >
> > Installation is possible from the OEM web interface.
> > Sysupgrade is possible.
> > TFTP recovery is possible.
> >   - Image: AD7200_1.0_tp_recovery.bin
> >
> > Notes
> >   - This will be the first 802.11ad device supported by mainline.
>
> Incredible that they chose ipq8064 for wifi ad and not the more recent soc...
This model is quite old, it came out when IPQ806x was fresh stuff.

Paul, where did you get the 802.11ad support code for OpenWrt?
>
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel@lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel
Paul Fertser Oct. 12, 2020, 8:08 a.m. UTC | #4
Hey Robert,

On Mon, Oct 12, 2020 at 09:52:07AM +0200, Robert Marko wrote:
> Paul, where did you get the 802.11ad support code for OpenWrt?

I just forwarded Gary's commit to the mailing list as somehow the
subscription confirmation mail doesn't get through to him.

That said, the commit doesn't feature much 802.11ad specific code, all
of the essential parts are available from the upstream projects
(kernel driver, hostapd/wpa_supplicant support), Gary just added a bit
of glue to enable it.
Robert Marko Oct. 12, 2020, 8:15 a.m. UTC | #5
On Mon, 12 Oct 2020 at 10:08, Paul Fertser <fercerpav@gmail.com> wrote:
>
> Hey Robert,
>
> On Mon, Oct 12, 2020 at 09:52:07AM +0200, Robert Marko wrote:
> > Paul, where did you get the 802.11ad support code for OpenWrt?
>
> I just forwarded Gary's commit to the mailing list as somehow the
> subscription confirmation mail doesn't get through to him.
>
> That said, the commit doesn't feature much 802.11ad specific code, all
> of the essential parts are available from the upstream projects
> (kernel driver, hostapd/wpa_supplicant support), Gary just added a bit
> of glue to enable it.

Hi,
I am asking since it looks really similar to my glue "code" from
Mikrotik LHGG PR from a while ago.
Are you sure that that changes to mac80211.sh work?
That appears to be just a part of the logic:
https://github.com/openwrt/openwrt/pull/2417/commits/72744f6ef08a9bc73f322b783a3945c2ac84b707

>
> --
> Be free, use free (http://www.gnu.org/philosophy/free-sw.html) software!
> mailto:fercerpav@gmail.com
Bas Mevissen Oct. 12, 2020, 9:20 a.m. UTC | #6
On 2020-10-12 01:09, Paul Fertser wrote:
> From: Gary Cooper <gaco@mail2tor.com>
> 
> Device hardware: https://deviwiki.com/wiki/TP-LINK_AD7200_(Talon)
> 
> The Talon AD7200 is basically an Archer C2600 with larger flash, a
> third PCIe lane and an 802.11ad radio. It comes in a different housing
> reminiscent of the Archers C3200 and C5400.
> 
> 
> Specifications
> --------------
> 
>   - IPQ8064 dual-core 1400MHz
>   - QCA9988 2.4GHz WiFi
>   - QCA9888 5GHz WiFi
>   - QCA9500 60GHz WiFi
>   - 256MiB SPI Flash
>   - 512MiB RAM
>   - 5 GBit Ports (QCA8337)
> 
> Installation
> ------------
> 
> Installation is possible from the OEM web interface.
> Sysupgrade is possible.
> TFTP recovery is possible.
>   - Image: AD7200_1.0_tp_recovery.bin
> 
> Notes
>   - This will be the first 802.11ad device supported by mainline.
> 
> Signed-off-by: Gary Cooper <gaco@mail2tor.com>

Nice work, but does it make sense to add a device that is already EOL'ed 
by the manufacturer? I guess the installed base is also rather small.

Reagrds,

Bas.
Bjørn Mork Oct. 12, 2020, 9:40 a.m. UTC | #7
Bas Mevissen <abuse@basmevissen.nl> writes:

> Nice work, but does it make sense to add a device that is already
> EOL'ed by the manufacturer? I guess the installed base is also rather
> small.

Definitely!

IMHO, it should me enough that there is one user with enough interest to
actually do the work, submit it and - hopefully - maintain it for a
while.

In addition,
 - each supported device serves as a template and example for
   similar devices, simplifying support for other products.
 - OpenWrt support is good for the environment by increasing the usable
   lifetime of a device
 - you can still buy this device new, despite the EoL announcement


Bjørn
Bas Mevissen Oct. 12, 2020, 9:59 a.m. UTC | #8
On 2020-10-12 11:40, Bjørn Mork wrote:
> Bas Mevissen <abuse@basmevissen.nl> writes:
> 
>> Nice work, but does it make sense to add a device that is already
>> EOL'ed by the manufacturer? I guess the installed base is also rather
>> small.
> 
> Definitely!
> 
> IMHO, it should me enough that there is one user with enough interest 
> to
> actually do the work, submit it and - hopefully - maintain it for a
> while.
> 

The latter, maintenance, is my biggest question mark. Technically 
keeping the sources compile is the smallest task. You need someone to 
actually use recent builds all the time and preferably in multiple use 
cases to catch regressions. Otherwise, it might give a false impression 
that the device is supported and working.

> In addition,
>  - each supported device serves as a template and example for
>    similar devices, simplifying support for other products.

It is not really an unique product. It looks like it was (just) created 
to be a showcase at CES2016.

>  - OpenWrt support is good for the environment by increasing the usable
>    lifetime of a device

True in itself. I have a very old TP-Link TL1043ND V1.x running (for 
which support will be removed soon because it gets very difficult to 
keep them going with current software sizes).

>  - you can still buy this device new, despite the EoL announcement
> 

But should you? I would be very reluctant with buying EOL devices, 
especially when being a "first" and with the price still up.

I think that OpenWRT should be careful not to spend resources on devices 
that have no large install base nor any chance of getting it. In that 
respect, I would prefer to prioritize on low RAM / low flash devices 
instead as they are everywhere and mostly running outdated insecure 
software. With things like ZRAM and an external flash drive, there life 
span could be meaningfully extended.

> 
> Bjørn

Bas.
Bjørn Mork Oct. 12, 2020, 10:17 a.m. UTC | #9
Bas Mevissen <abuse@basmevissen.nl> writes:

>> In addition,
>>  - each supported device serves as a template and example for
>>    similar devices, simplifying support for other products.
>
> It is not really an unique product. It looks like it was (just)
> created to be a showcase at CES2016.

This argument works both ways: If it isn't unique, then there is no
additional cost supporting the device.

But in this case, the minor difference is AD support.  Which makes it a
valuable example.  And another feature to check off as "supported" on
the OpenWrt brag list.


Bjørn
Daniel Golle Oct. 12, 2020, 10:46 a.m. UTC | #10
On Mon, Oct 12, 2020 at 11:59:17AM +0200, Bas Mevissen wrote:
> On 2020-10-12 11:40, Bjørn Mork wrote:
> > Bas Mevissen <abuse@basmevissen.nl> writes:
> > 
> > > Nice work, but does it make sense to add a device that is already
> > > EOL'ed by the manufacturer? I guess the installed base is also rather
> > > small.
> > 
> > Definitely!
> > 
> > IMHO, it should me enough that there is one user with enough interest to
> > actually do the work, submit it and - hopefully - maintain it for a
> > while.
> > 
> 
> The latter, maintenance, is my biggest question mark. Technically keeping
> the sources compile is the smallest task. You need someone to actually use
> recent builds all the time and preferably in multiple use cases to catch
> regressions. Otherwise, it might give a false impression that the device is
> supported and working.
> 
> > In addition,
> >  - each supported device serves as a template and example for
> >    similar devices, simplifying support for other products.
> 
> It is not really an unique product. It looks like it was (just) created to
> be a showcase at CES2016.

To me it makes sense to support this device because it's easier to do
than MikroTik or ubnt devices with 802.11ad which have their special
quirks for EEPROM extraction and such (but yet those are very
interesting targets imho!). Starting with a TP-Link device which more
or less implements a plain reference design is a very good start for
802.11ad in Openwrt.


> 
> >  - OpenWrt support is good for the environment by increasing the usable
> >    lifetime of a device
> 
> True in itself. I have a very old TP-Link TL1043ND V1.x running (for which
> support will be removed soon because it gets very difficult to keep them
> going with current software sizes).
> 
> >  - you can still buy this device new, despite the EoL announcement
> > 
> 
> But should you? I would be very reluctant with buying EOL devices,
> especially when being a "first" and with the price still up.
> 
> I think that OpenWRT should be careful not to spend resources on devices
> that have no large install base nor any chance of getting it. In that
> respect, I would prefer to prioritize on low RAM / low flash devices instead
> as they are everywhere and mostly running outdated insecure software. With
> things like ZRAM and an external flash drive, there life span could be
> meaningfully extended.
> 
> > 
> > Bjørn
> 
> Bas.
> 
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel@lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel
Bas Mevissen Oct. 12, 2020, 11:24 a.m. UTC | #11
On 2020-10-12 12:46, Daniel Golle wrote:
> On Mon, Oct 12, 2020 at 11:59:17AM +0200, Bas Mevissen wrote:
>> On 2020-10-12 11:40, Bjørn Mork wrote:
>> > Bas Mevissen <abuse@basmevissen.nl> writes:
>> >
>> > > Nice work, but does it make sense to add a device that is already
>> > > EOL'ed by the manufacturer? I guess the installed base is also rather
>> > > small.
>> >
>> > Definitely!
>> >
>> > IMHO, it should me enough that there is one user with enough interest to
>> > actually do the work, submit it and - hopefully - maintain it for a
>> > while.
>> >
>> 
>> The latter, maintenance, is my biggest question mark. Technically 
>> keeping
>> the sources compile is the smallest task. You need someone to actually 
>> use
>> recent builds all the time and preferably in multiple use cases to 
>> catch
>> regressions. Otherwise, it might give a false impression that the 
>> device is
>> supported and working.
>> 
>> > In addition,
>> >  - each supported device serves as a template and example for
>> >    similar devices, simplifying support for other products.
>> 
>> It is not really an unique product. It looks like it was (just) 
>> created to
>> be a showcase at CES2016.
> 
> To me it makes sense to support this device because it's easier to do
> than MikroTik or ubnt devices with 802.11ad which have their special
> quirks for EEPROM extraction and such (but yet those are very
> interesting targets imho!). Starting with a TP-Link device which more
> or less implements a plain reference design is a very good start for
> 802.11ad in Openwrt.
> 

OK, good point. I'll buy a few when the price drops :-)
Obviously, my concern about maintenance remains when there is support 
for a more popular equivalent device.

> 
>> 
>> >  - OpenWrt support is good for the environment by increasing the usable
>> >    lifetime of a device
>> 
>> True in itself. I have a very old TP-Link TL1043ND V1.x running (for 
>> which
>> support will be removed soon because it gets very difficult to keep 
>> them
>> going with current software sizes).
>> 
>> >  - you can still buy this device new, despite the EoL announcement
>> >
>> 
>> But should you? I would be very reluctant with buying EOL devices,
>> especially when being a "first" and with the price still up.
>> 
>> I think that OpenWRT should be careful not to spend resources on 
>> devices
>> that have no large install base nor any chance of getting it. In that
>> respect, I would prefer to prioritize on low RAM / low flash devices 
>> instead
>> as they are everywhere and mostly running outdated insecure software. 
>> With
>> things like ZRAM and an external flash drive, there life span could be
>> meaningfully extended.
>> 
>> >
>> > Bjørn
>> 
>> Bas.
>> 
>> _______________________________________________
>> openwrt-devel mailing list
>> openwrt-devel@lists.openwrt.org
>> https://lists.openwrt.org/mailman/listinfo/openwrt-devel
diff mbox series

Patch

diff --git a/package/base-files/files/sbin/wifi b/package/base-files/files/sbin/wifi
index a8b4451c60..75759b94f3 100755
--- a/package/base-files/files/sbin/wifi
+++ b/package/base-files/files/sbin/wifi
@@ -79,6 +79,7 @@  wifi_fixup_hwmode() {
 	case "$hwmode" in
 		11bg) hwmode=bg;;
 		11a) hwmode=a;;
+		11ad) hwmode=ad;;
 		11b) hwmode=b;;
 		11g) hwmode=g;;
 		11n*)
diff --git a/package/firmware/linux-firmware/qca.mk b/package/firmware/linux-firmware/qca.mk
index 23fcc0905a..71b484d5c7 100644
--- a/package/firmware/linux-firmware/qca.mk
+++ b/package/firmware/linux-firmware/qca.mk
@@ -37,3 +37,11 @@  define Package/carl9170-firmware/install
 	$(INSTALL_DATA) $(PKG_BUILD_DIR)/carl9170-1.fw $(1)/lib/firmware
 endef
 $(eval $(call BuildPackage,carl9170-firmware))
+
+Package/wil6210-firmware = $(call Package/firmware-default,wil6210 firmware)
+define Package/wil6210-firmware/install
+	$(INSTALL_DIR) $(1)/lib/firmware
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/wil6210.fw $(1)/lib/firmware
+	$(INSTALL_DATA) $(PKG_BUILD_DIR)/wil6210.brd $(1)/lib/firmware
+endef
+$(eval $(call BuildPackage,wil6210-firmware))
diff --git a/package/kernel/mac80211/ath.mk b/package/kernel/mac80211/ath.mk
index 5db4be8daa..e563fb71fc 100644
--- a/package/kernel/mac80211/ath.mk
+++ b/package/kernel/mac80211/ath.mk
@@ -1,6 +1,6 @@ 
 PKG_DRIVERS += \
 	ath ath5k ath6kl ath6kl-sdio ath6kl-usb ath9k ath9k-common ath9k-htc ath10k \
-	carl9170 owl-loader ar5523
+	carl9170 wil6210 owl-loader ar5523
 
 PKG_CONFIG_DEPENDS += \
 	CONFIG_PACKAGE_ATH_DEBUG \
@@ -20,6 +20,7 @@  ifdef CONFIG_PACKAGE_MAC80211_DEBUGFS
 	ATH9K_HTC_DEBUGFS \
 	ATH10K_DEBUGFS \
 	CARL9170_DEBUGFS \
+	WIL6210_DEBUGFS \
 	ATH5K_DEBUG \
 	ATH6KL_DEBUG
 endif
@@ -29,6 +30,7 @@  ifdef CONFIG_PACKAGE_MAC80211_TRACING
 	ATH10K_TRACING \
 	ATH6KL_TRACING \
 	ATH_TRACEPOINTS \
+	WIL6210_TRACING
 	ATH5K_TRACER
 endif
 
@@ -66,6 +68,7 @@  config-$(call config_package,ath6kl-sdio) += ATH6KL_SDIO
 config-$(call config_package,ath6kl-usb) += ATH6KL_USB
 
 config-$(call config_package,carl9170) += CARL9170
+config-$(call config_package,wil6210) += WIL6210
 config-$(call config_package,ar5523) += AR5523
 
 define KernelPackage/ath/config
@@ -284,6 +287,14 @@  define KernelPackage/carl9170
   AUTOLOAD:=$(call AutoProbe,carl9170)
 endef
 
+define KernelPackage/wil6210
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=QCA/Wilocity 60g WiFi card wil6210 support
+  DEPENDS+= @PCI_SUPPORT +kmod-mac80211 +wil6210-firmware
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/wil6210/wil6210.ko
+  AUTOLOAD:=$(call AutoProbe,wil6210)
+endef
+
 define KernelPackage/owl-loader
   $(call KernelPackage/mac80211/Default)
   TITLE:=Owl loader for initializing Atheros PCI(e) Wifi chips
diff --git a/package/kernel/mac80211/files/lib/wifi/mac80211.sh b/package/kernel/mac80211/files/lib/wifi/mac80211.sh
index c0fbfbe5a8..3e99f06693 100644
--- a/package/kernel/mac80211/files/lib/wifi/mac80211.sh
+++ b/package/kernel/mac80211/files/lib/wifi/mac80211.sh
@@ -88,6 +88,12 @@  detect_mac80211() {
 			iw phy "$dev" info | grep -q 'VHT Capabilities' && htmode="VHT80"
 		}
 
+		iw phy "$dev" info | grep -q '\* 5.... MHz \[' && {
+			mode_band="ad"
+			channel=$(iw phy "$dev" info | grep '\* 5.... MHz \[' | grep '(disabled)' -v -m 1 | sed 's/[^[]*\[\|\|\].*//g')
+			iw phy "$dev" info | grep -q 'Capabilities:' && htmode="HT20"
+		}
+
 		[ -n "$htmode" ] && ht_capab="set wireless.radio${devidx}.htmode=$htmode"
 
 		path="$(mac80211_phy_to_path "$dev")"
diff --git a/package/network/services/hostapd/files/hostapd.sh b/package/network/services/hostapd/files/hostapd.sh
index 3290358ed2..b5563d88a6 100644
--- a/package/network/services/hostapd/files/hostapd.sh
+++ b/package/network/services/hostapd/files/hostapd.sh
@@ -1163,6 +1163,14 @@  wpa_supplicant_add_network() {
 		;;
 	esac
 
+	case "$wpa_cipher" in
+		GCMP)
+			append network_data "pairwise=GCMP" "$N$T"
+			append network_data "group=GCMP" "$N$T"
+		;;
+		*) ;;
+	esac
+
 	[ "$mode" = mesh ] || {
 		case "$wpa" in
 			1)
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 c23f25540b..7af06fd3ee 100755
--- a/target/linux/ipq806x/base-files/etc/board.d/01_leds
+++ b/target/linux/ipq806x/base-files/etc/board.d/01_leds
@@ -36,6 +36,15 @@  netgear,r7800)
 	ucidef_set_led_switch "wan" "WAN" "white:wan" "switch0" "0x20"
 	ucidef_set_led_ide "esata" "eSATA" "white:esata"
 	;;
+tplink,ad7200)
+	ucidef_set_led_usbport "usb1" "USB 1" "blue:usb_1" "usb1-port1" "usb2-port1"
+	ucidef_set_led_usbport "usb2" "USB 2" "blue:usb_3" "usb3-port1" "usb4-port1"
+	ucidef_set_led_switch "wan" "wan" "blue:wan" "switch0" "0x02"
+	ucidef_set_led_switch "lan" "lan" "blue:lan" "switch0" "0x3c"
+	ucidef_set_led_wlan "wlan2g" "wlan2g" "blue:wlan2g" "phy2tpt"
+	ucidef_set_led_wlan "wlan5g" "wlan5g" "blue:wlan5g" "phy1tpt"
+	ucidef_set_led_netdev "wlan60g" "wlan60g" "blue:wlan60g" "phy0tpt"
+	;;
 tplink,c2600)
 	ucidef_set_led_usbport "usb1" "USB 1" "white:usb_2" "usb1-port1" "usb2-port1"
 	ucidef_set_led_usbport "usb2" "USB 2" "white:usb_4" "usb3-port1" "usb4-port1"
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 3f9d96881d..d013f114b4 100755
--- a/target/linux/ipq806x/base-files/etc/board.d/02_network
+++ b/target/linux/ipq806x/base-files/etc/board.d/02_network
@@ -50,6 +50,10 @@  tplink,c2600)
 	ucidef_add_switch "switch0" \
 		"1:lan:4" "2:lan:3" "3:lan:2" "4:lan:1" "6@eth1" "5:wan" "0@eth0"
 	;;
+tplink,ad7200)
+	ucidef_add_switch "switch0" \
+		"2:lan" "3:lan" "4:lan" "5:lan" "6@eth1" "1:wan" "0@eth0"
+	;;
 qcom,ipq8064-ap161)
 	ucidef_set_interface_lan "eth1 eth2"
 	ucidef_add_switch "switch0" \
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
index 74ad00c5ce..5a19d30538 100644
--- 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
@@ -31,6 +31,7 @@  case "$FIRMWARE" in
 		caldata_extract "art" 0x1000 0x2f20
 		ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary art 0x6) +1)
 		;;
+	tplink,ad7200 |\
 	tplink,c2600)
 		caldata_extract "radio" 0x1000 0x2f20
 		ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary default-mac 0x8) -1)
@@ -66,6 +67,7 @@  case "$FIRMWARE" in
 		caldata_extract "art" 0x5000 0x2f20
 		ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary art 0x6) +2)
 		;;
+	tplink,ad7200 |\
 	tplink,c2600)
 		caldata_extract "radio" 0x5000 0x2f20
 		ath10k_patch_mac $(mtd_get_mac_binary default-mac 0x8)
diff --git a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
index f61e8ee878..a20d1bbd5b 100644
--- a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
@@ -39,6 +39,7 @@  platform_do_upgrade() {
 	linksys,ea8500)
 		platform_do_upgrade_linksys "$1"
 		;;
+	tplink,ad7200 |\
 	tplink,c2600)
 		PART_NAME="os-image:rootfs"
 		MTD_CONFIG_ARGS="-s 0x200000"
diff --git a/target/linux/ipq806x/files-5.4/arch/arm/boot/dts/qcom-ipq8064-ad7200.dts b/target/linux/ipq806x/files-5.4/arch/arm/boot/dts/qcom-ipq8064-ad7200.dts
new file mode 100644
index 0000000000..14ed8b49cc
--- /dev/null
+++ b/target/linux/ipq806x/files-5.4/arch/arm/boot/dts/qcom-ipq8064-ad7200.dts
@@ -0,0 +1,440 @@ 
+SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+#include "qcom-ipq8064-v2.0.dtsi"
+
+#include <dt-bindings/input/input.h>
+
+/ {
+	model = "TP-Link Talon AD7200";
+	compatible = "tplink,ad7200", "qcom,ipq8064";
+
+	memory@0 {
+		reg = <0x42000000 0x1e000000>;
+		device_type = "memory";
+	};
+
+	aliases {
+		mdio-gpio0 = &mdio0;
+
+		led-boot = &power;
+		led-failsafe = &power;
+		led-running = &power;
+		led-upgrade = &power;
+		label-mac-device = &gmac2;
+	};
+
+	keys {
+		compatible = "gpio-keys";
+		pinctrl-0 = <&button_pins>;
+		pinctrl-names = "default";
+
+		wifi {
+			label = "wifi";
+			gpios = <&qcom_pinmux 54 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_RFKILL>;
+		};
+
+		reset {
+			label = "reset";
+			gpios = <&qcom_pinmux 7 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_RESTART>;
+		};
+
+		wps {
+			label = "wps";
+			gpios = <&qcom_pinmux 67 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_WPS_BUTTON>;
+		};
+
+		ledgeneral {
+			label = "ledswitch";
+			gpios = <&qcom_pinmux 53 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_LIGHTS_TOGGLE>;
+		};
+	};
+
+	leds {
+		compatible = "gpio-leds";
+		pinctrl-0 = <&led_pins>;
+		pinctrl-names = "default";
+
+		lan {
+			label = "blue:lan";
+			gpios = <&qcom_pinmux 2 GPIO_ACTIVE_HIGH>;
+		};
+
+		usb1 {
+			label = "blue:usb_1";
+			gpios = <&qcom_pinmux 8 GPIO_ACTIVE_HIGH>;
+		};
+
+		usb3 {
+			label = "blue:usb_3";
+			gpios = <&qcom_pinmux 16 GPIO_ACTIVE_HIGH>;
+		};
+
+		wps {
+			label = "blue:wps";
+			gpios = <&qcom_pinmux 55 GPIO_ACTIVE_HIGH>;
+		};
+
+		wan_orange {
+			label = "orange:wan";
+			gpios = <&qcom_pinmux 26 GPIO_ACTIVE_LOW>;
+		};
+
+		wan_blue {
+			label = "blue:wan";
+			gpios = <&qcom_pinmux 33 GPIO_ACTIVE_LOW>;
+		};
+
+		power: status {
+			label = "blue:status";
+			gpios = <&qcom_pinmux 66 GPIO_ACTIVE_HIGH>;
+		};
+
+		wlan2g {
+			label = "blue:wlan2g";
+			gpios = <&qcom_pinmux 17 GPIO_ACTIVE_HIGH>;
+
+		};
+
+		wlan5g {
+			label = "blue:wlan5g";
+			gpios = <&qcom_pinmux 15 GPIO_ACTIVE_HIGH>;
+
+		};
+
+		wlan60g {
+			label = "blue:wlan60g";
+			gpios = <&qcom_pinmux 56 GPIO_ACTIVE_HIGH>;
+		};
+	};
+};
+
+&qcom_pinmux {
+	button_pins: button_pins {
+		mux {
+			pins = "gpio53", "gpio54", "gpio67";
+			function = "gpio";
+			drive-strength = <2>;
+			bias-pull-up;
+		};
+	};
+
+	led_pins: led_pins {
+		mux {
+			pins = "gpio2", "gpio8", "gpio15", "gpio16", "gpio17", "gpio26",
+					"gpio33", "gpio55", "gpio56", "gpio66";
+			function = "gpio";
+			drive-strength = <2>;
+			bias-pull-up;
+		};
+	};
+
+	spi_pins: spi_pins {
+		mux {
+			pins = "gpio18", "gpio19", "gpio21";
+			function = "gsbi5";
+			bias-pull-down;
+		};
+
+		data {
+			pins = "gpio18", "gpio19";
+			drive-strength = <10>;
+		};
+
+		cs {
+			pins = "gpio20";
+			function = "gpio";
+			drive-strength = <10>;
+			bias-pull-up;
+		};
+
+		clk {
+			pins = "gpio21";
+			drive-strength = <12>;
+		};
+	};
+
+	usb0_pwr_en_pin: usb0_pwr_en_pin {
+		mux {
+			pins = "gpio25";
+			function = "gpio";
+			drive-strength = <10>;
+			bias-pull-up;
+			output-high;
+		};
+	};
+
+	usb1_pwr_en_pin: usb1_pwr_en_pin {
+		mux {
+			pins = "gpio23";
+			function = "gpio";
+			drive-strength = <10>;
+			bias-pull-up;
+			output-high;
+		};
+	};
+};
+
+&gsbi5 {
+	qcom,mode = <GSBI_PROT_SPI>;
+	status = "okay";
+
+	spi4: spi@1a280000 {
+		status = "okay";
+
+		pinctrl-0 = <&spi_pins>;
+		pinctrl-names = "default";
+
+		cs-gpios = <&qcom_pinmux 20 GPIO_ACTIVE_HIGH>;
+
+		m25p80@0 {
+			compatible = "jedec,spi-nor";
+			#address-cells = <1>;
+			#size-cells = <1>;
+			spi-max-frequency = <50000000>;
+			reg = <0>;
+
+			SBL1@0 {
+				label = "SBL1";
+				reg = <0x0 0x20000>;
+				read-only;
+			};
+
+			MIBIB@20000 {
+				label = "MIBIB";
+				reg = <0x20000 0x20000>;
+				read-only;
+			};
+
+			SBL2@40000 {
+				label = "SBL2";
+				reg = <0x40000 0x20000>;
+				read-only;
+			};
+
+			SBL3@60000 {
+				label = "SBL3";
+				reg = <0x60000 0x30000>;
+				read-only;
+			};
+
+			DDRCONFIG@90000 {
+				label = "DDRCONFIG";
+				reg = <0x90000 0x10000>;
+				read-only;
+			};
+
+			SSD@a0000 {
+				label = "SSD";
+				reg = <0xa0000 0x10000>;
+				read-only;
+			};
+
+			TZ@b0000 {
+				label = "TZ";
+				reg = <0xb0000 0x30000>;
+				read-only;
+			};
+
+			RPM@e0000 {
+				label = "RPM";
+				reg = <0xe0000 0x20000>;
+				read-only;
+			};
+
+			fs-uboot@100000 {
+				label = "fs-uboot";
+				reg = <0x100000 0x70000>;
+				read-only;
+			};
+
+			uboot-env@170000 {
+				label = "uboot-env";
+				reg = <0x170000 0x40000>;
+				read-only;
+			};
+
+			radio@1b0000 {
+				label = "radio";
+				reg = <0x1b0000 0x40000>;
+				read-only;
+			};
+
+			os-image@1f0000 {
+				label = "os-image";
+				reg = <0x1f0000 0x400000>;
+			};
+
+			rootfs@5f0000 {
+				label = "rootfs";
+				reg = <0x5f0000 0x1900000>;
+			};
+
+			defaultmac: default-mac@1ef0000 {
+				label = "default-mac";
+				reg = <0x1ef0000 0x00200>;
+				read-only;
+			};
+
+			pin@1ef0200 {
+				label = "pin";
+				reg = <0x1ef0200 0x00200>;
+				read-only;
+			};
+
+			device-id@1ef0400 {
+				label = "device-id";
+				reg = <0x1ef0400 0x00200>;
+				read-only;
+			};
+
+			product-info@1ef0600 {
+				label = "product-info";
+				reg = <0x1ef0600 0x0fa00>;
+				read-only;
+			};
+
+			partition-table@1f00000 {
+				label = "partition-table";
+				reg = <0x1f00000 0x10000>;
+				read-only;
+			};
+
+			soft-version@1f10000 {
+				label = "soft-version";
+				reg = <0x1f10000 0x10000>;
+				read-only;
+			};
+
+			support-list@1f20000 {
+				label = "support-list";
+				reg = <0x1f20000 0x10000>;
+				read-only;
+			};
+
+			profile@1f30000 {
+				label = "profile";
+				reg = <0x1f30000 0x10000>;
+				read-only;
+			};
+
+			default-config@1f40000 {
+				label = "default-config";
+				reg = <0x1f40000 0x10000>;
+				read-only;
+			};
+
+			user-config@1f50000 {
+				label = "user-config";
+				reg = <0x1f50000 0x40000>;
+				read-only;
+			};
+
+			qos-db@1f90000 {
+				label = "qos-db";
+				reg = <0x1f90000 0x40000>;
+				read-only;
+			};
+
+			usb-config@1fd0000 {
+				label = "usb-config";
+				reg = <0x1fd0000 0x10000>;
+				read-only;
+			};
+
+			log@1fe0000 {
+				label = "log";
+				reg = <0x1fe0000 0x20000>;
+				read-only;
+			};
+		};
+	};
+};
+
+&usb3_0 {
+	status = "okay";
+
+	pinctrl-0 = <&usb0_pwr_en_pin>;
+	pinctrl-names = "default";
+};
+
+&usb3_1 {
+	status = "okay";
+
+	pinctrl-0 = <&usb1_pwr_en_pin>;
+	pinctrl-names = "default";
+};
+
+&pcie0 {
+	status = "okay";
+};
+
+&pcie1 {
+	status = "okay";
+	max-link-speed = <1>;
+};
+
+&pcie2 {
+	status = "okay";
+	max-link-speed = <1>;
+};
+
+&mdio0 {
+	status = "okay";
+
+	pinctrl-0 = <&mdio0_pins>;
+	pinctrl-names = "default";
+
+	phy0: ethernet-phy@0 {
+		reg = <0>;
+		qca,ar8327-initvals = <
+			0x00004 0x7600000   /* PAD0_MODE */
+			0x00008 0x1000000   /* PAD5_MODE */
+			0x0000c 0x80        /* PAD6_MODE */
+			0x000e4 0x6a545     /* MAC_POWER_SEL */
+			0x000e0 0xc74164de  /* SGMII_CTRL */
+			0x0007c 0x4e        /* PORT0_STATUS */
+			0x00094 0x4e        /* PORT6_STATUS */
+			>;
+	};
+
+	phy4: ethernet-phy@4 {
+		reg = <4>;
+	};
+};
+
+&gmac1 {
+	status = "okay";
+	phy-mode = "rgmii";
+	qcom,id = <1>;
+
+	pinctrl-0 = <&rgmii2_pins>;
+	pinctrl-names = "default";
+
+	mtd-mac-address = <&defaultmac 0x8>;
+	mtd-mac-address-increment = <1>;
+
+	fixed-link {
+		speed = <1000>;
+		full-duplex;
+	};
+};
+
+&gmac2 {
+	status = "okay";
+	phy-mode = "sgmii";
+	qcom,id = <2>;
+
+	mtd-mac-address = <&defaultmac 0x8>;
+
+	fixed-link {
+		speed = <1000>;
+		full-duplex;
+	};
+};
+
+&adm_dma {
+	status = "okay";
+};
diff --git a/target/linux/ipq806x/image/Makefile b/target/linux/ipq806x/image/Makefile
index ec73630ae5..6e3ef6f526 100644
--- a/target/linux/ipq806x/image/Makefile
+++ b/target/linux/ipq806x/image/Makefile
@@ -295,6 +295,21 @@  define Device/qcom_ipq8064-db149
 endef
 TARGET_DEVICES += qcom_ipq8064-db149
 
+define Device/tplink_ad7200
+	$(call Device/TpSafeImage)
+	DEVICE_VENDOR := TP-Link
+	DEVICE_MODEL := Talon AD7200
+	DEVICE_VARIANT := v1
+	SOC := qcom-ipq8064
+	BLOCKSIZE := 128k
+	PAGESIZE := 2048
+	BOARD_NAME := ad7200
+	SUPPORTED_DEVICES += ad7200
+	TPLINK_BOARD_ID := AD7200
+	DEVICE_PACKAGES := ath10k-firmware-qca99x0-ct kmod-wil6210
+endef
+TARGET_DEVICES += tplink_ad7200
+
 define Device/tplink_c2600
 	$(call Device/TpSafeImage)
 	DEVICE_VENDOR := TP-Link
diff --git a/tools/firmware-utils/src/tplink-safeloader.c b/tools/firmware-utils/src/tplink-safeloader.c
index 31b9c032d1..08f96a5fa8 100644
--- a/tools/firmware-utils/src/tplink-safeloader.c
+++ b/tools/firmware-utils/src/tplink-safeloader.c
@@ -651,6 +651,50 @@  static struct device_info boards[] = {
 		.last_sysupgrade_partition = "support-list",
 	},
 
+	/** Firmware layout for the AD7200 */
+	{
+		.id = "AD7200",
+		.vendor = "",
+		.support_list =
+			"SupportList:\r\n"
+			"{product_name:Talon AD7200,product_ver:1.0.0,special_id:00000000}\r\n",
+		.support_trail = '\x00',
+		.soft_ver = NULL,
+
+		.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, 0x400000},
+			{"file-system", 0x5f0000, 0x1900000},
+			{"default-mac", 0x1ef0000, 0x00200},
+			{"pin", 0x1ef0200, 0x00200},
+			{"device-id", 0x1ef0400, 0x00200},
+			{"product-info", 0x1ef0600, 0x0fa00},
+			{"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}
+		},
+
+		.first_sysupgrade_partition = "os-image",
+		.last_sysupgrade_partition = "file-system"
+	},
+
 	/** Firmware layout for the C2600 */
 	{
 		.id     = "C2600",