ath79: add support for TP-Link Archer A9 v6
authorPiotr Dymacz <pepe2k@gmail.com>
Fri, 25 Feb 2022 22:01:10 +0000 (23:01 +0100)
committerPiotr Dymacz <pepe2k@gmail.com>
Sun, 27 Feb 2022 15:54:55 +0000 (16:54 +0100)
TP-Link Archer A9 v6 (FCCID: TE7A9V6) is an AC1900 Wave-2 gigabit home
router based on a combination of Qualcomm QCN5502 (most likely a 4x4:4
version of the QCA9563 WiSOC), QCA9984 and QCA8337N.

The vendor's firmware content reveals that the same device might be
available on the US market under name 'Archer C90 v6'. Due to lack of
access to such hardware, support introduced in this commit was tested
only on the EU version (sold under 'Archer A9 v6' name).

Based on the information on the PL version of the vendor website, this
device has been already phased out and is no longer available.

Specifications:

- Qualcomm QCN5502 (775 MHz)
- 128 MB of RAM (DDR2)
- 16 MB of flash (SPI NOR)
- 5x Gbps Ethernet (Qualcomm QCA8337N over SGMII)
- Wi-Fi:
  - 802.11b/g/n on 2.4 GHz: Qualcomm QCN5502* in 4x4:4 mode
  - 802.11a/n/ac on 5 GHz: Qualcomm QCA9984 in 3x3:3 mode
  - 3x non-detachable, dual-band external antennas (~3.5 dBi for 5 GHz,
    ~2.2 dBi for 2.4 GHz, IPEX/U.FL connectors)
  - 1x internal PCB antenna for 2.4 GHz (~1.8 dBi)
- 1x USB 2.0 Type-A
- 11x LED (4x connected to QCA8337N, 7x connected to QCN5502)
- 2x button (reset, WPS)
- UART (4-pin, 2.54 mm pitch) header on PCB (not populated)
- 1x mechanical power switch
- 1x DC jack (12 V)

  *) unsupported due to missing support for QCN550x in ath9k

UART system serial console notice:

The RX signal of the main SOC's UART on this device is shared with the
WPS button's GPIO. The first-stage U-Boot by default disables the RX,
resulting in a non-functional UART input.
If you press and keep 'ENTER' on the serial console during early
boot-up, the first-stage U-Boot will enable RX input.

Vendor firmware allows password-less access to the system over serial.

Flash instruction (vendor GUI):

1. It is recommended to first upgrade vendor firmware to the latest
   version (1.1.1 Build 20210315 rel.40637 at the time of writing).
2. Use the 'factory' image directly in the vendor's GUI.

Flash instruction (TFTP based recovery in second-stage U-Boot):

1. Rename 'factory' image to 'ArcherA9v6_tp_recovery.bin'
2. Setup a TFTP server on your PC with IP 192.168.0.66/24.
3. Press and hold the reset button for ~5 sec while turning on power.
4. The device will download image, flash it and reboot.

Flash instruction (web based recovery in first-stage U-Boot):

1. Use 'CTRL+C' during power-up to enable CLI in first-stage U-Boot.
2. Connect a PC with IP set to 192.168.0.1 to one of the LAN ports.
3. Issue 'httpd' command and visit http://192.168.0.1 in browser.
4. Use the 'factory' image.

If you would like to restore vendor's firmware, follow one of the
recovery methods described above.

Signed-off-by: Piotr Dymacz <pepe2k@gmail.com>
target/linux/ath79/dts/qcn5502_tplink_archer-a9-v6.dts [new file with mode: 0644]
target/linux/ath79/generic/base-files/etc/board.d/01_leds
target/linux/ath79/generic/base-files/etc/board.d/02_network
target/linux/ath79/image/generic-tp-link.mk

diff --git a/target/linux/ath79/dts/qcn5502_tplink_archer-a9-v6.dts b/target/linux/ath79/dts/qcn5502_tplink_archer-a9-v6.dts
new file mode 100644 (file)
index 0000000..c095bbd
--- /dev/null
@@ -0,0 +1,248 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include "qca956x.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+       model = "TP-Link Archer A9 v6";
+       compatible = "tplink,archer-a9-v6", "qca,qcn5500", "qca,qca9560";
+
+       aliases {
+               label-mac-device = &eth0;
+               led-boot = &led_power;
+               led-failsafe = &led_power;
+               led-running = &led_power;
+               led-upgrade = &led_power;
+       };
+
+       keys {
+               compatible = "gpio-keys";
+
+               reset {
+                       label = "reset";
+                       linux,code = <KEY_RESTART>;
+                       gpios = <&gpio 16 GPIO_ACTIVE_LOW>;
+                       debounce-interval = <60>;
+               };
+
+               wps {
+                       label = "wps";
+                       linux,code = <KEY_WPS_BUTTON>;
+                       gpios = <&gpio 18 GPIO_ACTIVE_LOW>;
+                       debounce-interval = <60>;
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               led_power: power {
+                       label = "green:power";
+                       gpios = <&gpio 17 GPIO_ACTIVE_LOW>;
+                       default-state = "on";
+               };
+
+               usb {
+                       label = "green:usb";
+                       gpios = <&gpio 0 GPIO_ACTIVE_HIGH>;
+                       trigger-sources = <&hub_port0>;
+                       linux,default-trigger = "usbport";
+               };
+
+               wan {
+                       label = "green:wan";
+                       gpios = <&gpio 4 GPIO_ACTIVE_LOW>;
+               };
+
+               wan_orange {
+                       label = "orange:wan";
+                       gpios = <&gpio 3 GPIO_ACTIVE_LOW>;
+               };
+
+               wlan2g {
+                       label = "green:wlan2g";
+                       gpios = <&gpio 15 GPIO_ACTIVE_LOW>;
+                       linux,default-trigger = "phy1tpt";
+               };
+
+               wlan5g {
+                       label = "green:wlan5g";
+                       gpios = <&gpio 20 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "phy0tpt";
+               };
+
+               wps {
+                       label = "green:wps";
+                       gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
+               };
+       };
+};
+
+&eth0 {
+       status = "okay";
+
+       pll-data = <0x03000101 0x00000101 0x00001919>;
+
+       phy-mode = "sgmii";
+       phy-handle = <&phy0>;
+
+       nvmem-cells = <&macaddr_info_8>;
+       nvmem-cell-names = "mac-address";
+};
+
+&mdio0 {
+       status = "okay";
+
+       phy-mask = <0>;
+
+       phy0: ethernet-phy@0 {
+               reg = <0>;
+               phy-mode = "sgmii";
+               qca,mib-poll-interval = <500>;
+
+               qca,ar8327-initvals = <
+                       0x04 0x80080080 /* PORT0 PAD MODE CTRL */
+                       0x08 0x00000000 /* PORT5 PAD MODE CTRL */
+                       0x0c 0x00000000 /* PORT6 PAD MODE CTRL */
+                       0x10 0x00000080 /* POWER_ON_STRAP */
+                       0x7c 0x0000007e /* PORT0_STATUS */
+                       0x94 0x00000200 /* PORT6_STATUS */
+                       >;
+       };
+};
+
+&pcie {
+       status = "okay";
+
+       wifi@0,0 {
+               compatible = "pci168c,0046";
+               reg = <0 0 0 0 0>;
+
+               nvmem-cells = <&macaddr_info_8>, <&precal_art_5000>;
+               nvmem-cell-names = "mac-address", "pre-calibration";
+
+               mac-address-increment = <(-1)>;
+       };
+};
+
+&spi {
+       status = "okay";
+
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               reg = <0>;
+               spi-max-frequency = <25000000>;
+               m25p,fast-read;
+
+               mtdparts: partitions {
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       partition@0 {
+                               label = "factory-uboot";
+                               reg = <0x000000 0x020000>;
+                               read-only;
+                       };
+
+                       partition@20000 {
+                               label = "u-boot";
+                               reg = <0x020000 0x020000>;
+                               read-only;
+                       };
+
+                       partition@40000 {
+                               label = "partition-table";
+                               reg = <0x040000 0x010000>;
+                               read-only;
+                       };
+
+                       partition@50000 {
+                               label = "art";
+                               reg = <0x050000 0x010000>;
+                               read-only;
+
+                               compatible = "nvmem-cells";
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+
+                               cal_art_1000: cal@1000 {
+                                       reg = <0x1000 0x440>;
+                               };
+
+                               precal_art_5000: precal@5000 {
+                                       reg = <0x5000 0x2f20>;
+                               };
+                       };
+
+                       partition@60000 {
+                               label = "info";
+                               reg = <0x060000 0x020000>;
+                               read-only;
+
+                               compatible = "nvmem-cells";
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+
+                               macaddr_info_8: macaddr@8 {
+                                       reg = <0x8 0x6>;
+                               };
+                       };
+
+                       partition@80000 {
+                               label = "user-config";
+                               reg = <0x080000 0x040000>;
+                               read-only;
+                       };
+
+                       partition@c0000 {
+                               compatible = "denx,uimage";
+                               label = "firmware";
+                               reg = <0x0c0000 0xf00000>;
+                       };
+
+                       partition@fc0000 {
+                               label = "log";
+                               reg = <0xfc0000 0x020000>;
+                               read-only;
+                       };
+
+                       partition@fe0000 {
+                               label = "certificate";
+                               reg = <0xfe0000 0x010000>;
+                               read-only;
+                       };
+
+                       partition@ff0000 {
+                               label = "default-config";
+                               reg = <0xff0000 0x010000>;
+                               read-only;
+                       };
+               };
+       };
+};
+
+&usb_phy0 {
+       status = "okay";
+};
+
+&usb0 {
+       #address-cells = <1>;
+       #size-cells = <0>;
+       status = "okay";
+
+       hub_port0: port@1 {
+               reg = <1>;
+               #trigger-source-cells = <0>;
+       };
+};
+
+&wmac {
+       /* TODO: missing support in ath9k */
+       status = "disabled";
+
+       nvmem-cells = <&cal_art_1000>, <&macaddr_info_8>;
+       nvmem-cell-names = "calibration", "mac-address";
+};
index 354df1da6f690e7ca6ea0acdff6bd0c8ddf93569..2ce489b0d1a28897a5ce3e4734c67151253e235b 100644 (file)
@@ -325,6 +325,9 @@ tplink,archer-c7-v5)
        ucidef_set_led_switch "lan3" "LAN3" "green:lan3" "switch0" "0x10"
        ucidef_set_led_switch "lan4" "LAN4" "green:lan4" "switch0" "0x20"
        ;;
+tplink,archer-a9-v6)
+       ucidef_set_led_switch "wan" "WAN" "green:wan" "switch0" "0x02"
+       ;;
 tplink,archer-c2-v3|\
 tplink,tl-wr1043nd-v4|\
 tplink,tl-wr1043n-v5)
index bb5c63a33e7bed5085de5da2ff7930a5ce4e264b..86ce8f5bd726ceff21c10dbde1847d860292000d 100644 (file)
@@ -337,6 +337,7 @@ ath79_setup_interfaces()
                ;;
        mercury,mw4530r-v1|\
        tplink,archer-a7-v5|\
+       tplink,archer-a9-v6|\
        tplink,archer-c6-v2|\
        tplink,archer-c6-v2-us|\
        tplink,archer-c7-v4|\
@@ -691,6 +692,7 @@ ath79_setup_macs()
                label_mac=$lan_mac
                ;;
        tplink,archer-a7-v5|\
+       tplink,archer-a9-v6|\
        tplink,archer-c7-v4|\
        tplink,archer-c7-v5|\
        tplink,tl-wr1043nd-v4|\
index c47fcd00393cc01fd687e4b73da52cc101631477..d6f7e7655d90c1193afb1e792c51f26fa449b6e3 100644 (file)
@@ -12,6 +12,18 @@ define Device/tplink_archer-a7-v5
 endef
 TARGET_DEVICES += tplink_archer-a7-v5
 
+define Device/tplink_archer-a9-v6
+  $(Device/tplink-safeloader-uimage)
+  SOC := qcn5502
+  IMAGE_SIZE := 15360k
+  DEVICE_MODEL := Archer A9
+  DEVICE_VARIANT := v6
+  DEVICE_PACKAGES := kmod-usb2 kmod-usb-ledtrig-usbport kmod-ath10k-ct \
+       ath10k-firmware-qca9984-ct
+  TPLINK_BOARD_ID := ARCHER-A9-V6
+endef
+TARGET_DEVICES += tplink_archer-a9-v6
+
 define Device/tplink_archer-c2-v3
   $(Device/tplink-safeloader-uimage)
   SOC := qca9563