Skip to content

Commit f808601

Browse files
committed
qualcommax: ipq807x: Add support for TP-Link Deco X60 v2 (EU)
TP-Link Deco X60 is a dual-band AX5400 Mesh WiFi 6 router. Version 2 (European variant) runs on Qualcomm IPQ8071 SoC with QCN5024/QCN5054 wireless chips. Hardware Specifications ----------------------- CPU: Qualcomm IPQ8071A RAM: 512 MiB Flash: 128 MiB Winbond W29N01HZ WiFi 2.4G: QCN5024 (2×2:2 MU-MIMO, 802.11ax/a/b/g/n) WiFi 5G: QCN5054 (2×4:4 MU-MIMO, 802.11ax/a/b/g/n/ac) Eth Switch: QCA8075 (2× 1GbE ports) Installation Notes ------------------ Initial access via hardware UART (pads on board, 115200 8n1): TP8 = VCC (1.8V) TP7 = GND TP6 = RX (connect to TX on adapter) TP5 = TX (connect to RX on adapter) Boot process from stock firmware: 1. Enter uboot with 'tpl' 2. Set server IP and use tftpboot command - setenv ipaddr 192.168.1.1 - setenv serverip 192.168.1.2 3. Load initramfs image: `tftpboot <initramfs.elf>` - tftpboot 0x44000000 192.168.1.2:openwrt-qualcommax-ipq807x-tplink_deco-x60-v2-initramfs-uImage.itb 4. Boot kernel: `bootm` Device Tree Changes ------------------- Added complete devicetree overlay with: * LED definitions (RGB status, per-radio activity indicators) * Button configuration (reset, WPS) * Ethernet switch binding (LAN/WAN port assignment) * WLAN ath11k driver integration MAC Address Layout ------------------ Base MAC address extracted from factory_data partition (/tmp/factory_data/default-mac): - WAN port: label_mac (stored value) - LAN port: label_mac + 1 (incremented by 1) Notes ------------------- Wifi firmware missing from OpenWRT. Pull request waiting in firmware_qca-wireless openwrt/firmware_qca-wireless#142 Tested On --------- Deco X60 v2 EU (hardware version printed on bottom label) Firmware: OpenWrt HEAD built on 5.7.2026 Signed-off-by: Timo Jutila <zutija@gmail.com>
1 parent ebbe3a0 commit f808601

8 files changed

Lines changed: 284 additions & 3 deletions

File tree

package/boot/uboot-tools/uboot-envtools/files/qualcommax_ipq807x

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ netgear,wax218|\
4949
netgear,wax620|\
5050
netgear,wax630|\
5151
tplink,deco-x80-5g|\
52+
tplink,deco-x60-v2|\
5253
tplink,eap620hd-v1|\
5354
tplink,eap660hd-v1)
5455
ubootenv_add_mtd "0:appsblenv" "0x0" "0x40000" "0x20000"

package/firmware/ipq-wifi/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ ALLWIFIBOARDS:= \
9393
tplink_archer-c60-v1 \
9494
tplink_archer-c60-v2 \
9595
tplink_deco-x80-5g \
96+
tplink_deco-x60-v2 \
9697
tplink_eap225-wall-v2 \
9798
tplink_eap610-outdoor \
9899
tplink_eap620-hd-v3 \
@@ -290,6 +291,7 @@ $(eval $(call generate-ipq-wifi-package,tplink_archer-c6-v2,TP-Link Archer C6 V2
290291
$(eval $(call generate-ipq-wifi-package,tplink_archer-c60-v1,TP-Link Archer C60 V1))
291292
$(eval $(call generate-ipq-wifi-package,tplink_archer-c60-v2,TP-Link Archer C60 V2))
292293
$(eval $(call generate-ipq-wifi-package,tplink_deco-x80-5g,TP-Link Deco X80-5G))
294+
$(eval $(call generate-ipq-wifi-package,tplink_deco-x60-v2,TP-Link Deco X60 v2))
293295
$(eval $(call generate-ipq-wifi-package,tplink_eap225-wall-v2,TP-Link EAP225-Wall v2))
294296
$(eval $(call generate-ipq-wifi-package,tplink_eap610-outdoor,TPLink EAP610-Outdoor))
295297
$(eval $(call generate-ipq-wifi-package,tplink_eap620-hd-v3,TP-Link EAP620 HD v3))
Lines changed: 258 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,258 @@
1+
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
2+
3+
/dts-v1/;
4+
5+
#include "ipq8074-512m.dtsi"
6+
#include "ipq8074-ac-cpu.dtsi"
7+
#include "ipq8074-ess.dtsi"
8+
#include <dt-bindings/gpio/gpio.h>
9+
#include <dt-bindings/input/input.h>
10+
#include <dt-bindings/leds/common.h>
11+
12+
/ {
13+
model = "TP-Link Deco X60 v2";
14+
compatible = "tplink,deco-x60-v2", "qcom,ipq8074";
15+
16+
aliases {
17+
serial0 = &blsp1_uart5;
18+
led-boot = &led_red;
19+
led-failsafe = &led_red;
20+
led-running = &led_green;
21+
led-upgrade = &led_blue;
22+
};
23+
24+
chosen {
25+
stdout-path = "serial0:115200n8";
26+
bootargs-append = " root=/dev/ubiblock0_1 swiotlb=1 coherent_pool=2M";
27+
};
28+
29+
keys {
30+
compatible = "gpio-keys";
31+
pinctrl-0 = <&button_pins &button_wps_pins>;
32+
pinctrl-names = "default";
33+
34+
reset {
35+
label = "reset";
36+
linux,code = <KEY_RESTART>;
37+
gpios = <&tlmm 26 GPIO_ACTIVE_LOW>;
38+
};
39+
40+
wps {
41+
label = "wps";
42+
linux,code = <KEY_WPS_BUTTON>;
43+
gpios = <&tlmm 34 GPIO_ACTIVE_LOW>;
44+
};
45+
};
46+
47+
leds {
48+
compatible = "gpio-leds";
49+
pinctrl-0 = <&led_pins>;
50+
pinctrl-names = "default";
51+
status = "okay";
52+
53+
led_red: red {
54+
color = <LED_COLOR_ID_RED>;
55+
function = LED_FUNCTION_STATUS;
56+
gpios = <&tlmm 31 GPIO_ACTIVE_HIGH>;
57+
default-state = "on";
58+
};
59+
60+
led_green: green {
61+
color = <LED_COLOR_ID_GREEN>;
62+
function = LED_FUNCTION_STATUS;
63+
gpios = <&tlmm 30 GPIO_ACTIVE_HIGH>;
64+
default-state = "on";
65+
};
66+
67+
led_blue: blue {
68+
color = <LED_COLOR_ID_BLUE>;
69+
function = LED_FUNCTION_STATUS;
70+
gpios = <&tlmm 32 GPIO_ACTIVE_HIGH>;
71+
default-state = "off";
72+
};
73+
74+
wlan2g {
75+
color = <LED_COLOR_ID_GREEN>;
76+
function = LED_FUNCTION_WLAN_2GHZ;
77+
gpios = <&tlmm 42 GPIO_ACTIVE_HIGH>;
78+
linux,default-trigger = "phy1radio";
79+
};
80+
81+
wlan5g {
82+
color = <LED_COLOR_ID_GREEN>;
83+
function = LED_FUNCTION_WLAN_5GHZ;
84+
gpios = <&tlmm 43 GPIO_ACTIVE_HIGH>;
85+
linux,default-trigger = "phy0radio";
86+
};
87+
};
88+
};
89+
90+
&tlmm {
91+
mdio_pins: mdio-pins {
92+
mdc {
93+
pins = "gpio68";
94+
function = "mdc";
95+
drive-strength = <8>;
96+
bias-pull-up;
97+
};
98+
99+
mdio {
100+
pins = "gpio69";
101+
function = "mdio";
102+
drive-strength = <8>;
103+
bias-pull-up;
104+
};
105+
};
106+
107+
button_pins: button-pins {
108+
mux {
109+
pins = "gpio26";
110+
function = "gpio";
111+
drive-strength = <8>;
112+
bias-pull-up;
113+
};
114+
};
115+
116+
button_wps_pins: wps-button-pins {
117+
mux {
118+
pins = "gpio34";
119+
function = "gpio";
120+
drive-strength = <8>;
121+
bias-pull-up;
122+
};
123+
};
124+
125+
led_pins: led-pins {
126+
mux_0 {
127+
pins = "gpio31", "gpio32", "gpio30"; /* RGB LEDs */
128+
function = "gpio";
129+
drive-strength = <8>;
130+
bias-pull-down;
131+
};
132+
mux_1 {
133+
pins = "gpio42", "gpio43"; /* WiFi activity LEDs */
134+
function = "gpio";
135+
drive-strength = <8>;
136+
bias-pull-down;
137+
};
138+
};
139+
};
140+
141+
&qpic_nand {
142+
status = "okay";
143+
144+
nand@0 {
145+
reg = <0>;
146+
nand-ecc-strength = <4>;
147+
nand-ecc-step-size = <512>;
148+
nand-bus-width = <8>;
149+
150+
partitions {
151+
compatible = "qcom,smem-part"; /* define SMEM partition table */
152+
};
153+
};
154+
};
155+
156+
&blsp1_uart5 {
157+
status = "okay";
158+
};
159+
160+
&cryptobam {
161+
status = "okay";
162+
};
163+
164+
&crypto {
165+
status = "okay";
166+
};
167+
168+
&prng {
169+
status = "okay";
170+
};
171+
172+
&qpic_bam {
173+
status = "okay";
174+
};
175+
176+
&qusb_phy_0 {
177+
status = "okay";
178+
};
179+
180+
&ssphy_0 {
181+
status = "okay";
182+
};
183+
184+
&usb_0 {
185+
status = "okay";
186+
};
187+
188+
&edma {
189+
status = "okay";
190+
};
191+
192+
&pcie0 {
193+
status = "okay";
194+
};
195+
196+
&mdio {
197+
status = "okay";
198+
pinctrl-0 = <&mdio_pins>;
199+
pinctrl-names = "default";
200+
reset-gpios = <&tlmm 37 GPIO_ACTIVE_LOW>;
201+
202+
ethernet-phy-package@0 {
203+
#address-cells = <1>;
204+
#size-cells = <0>;
205+
compatible = "qcom,qca8075-package";
206+
reg = <0>;
207+
208+
qca8075_3: ethernet-phy@3 {
209+
compatible = "ethernet-phy-ieee802.3-c22";
210+
reg = <3>;
211+
};
212+
213+
qca8075_4: ethernet-phy@4 {
214+
compatible = "ethernet-phy-ieee802.3-c22";
215+
reg = <4>;
216+
};
217+
};
218+
};
219+
220+
&switch {
221+
status = "okay";
222+
223+
switch_lan_bmp = <ESS_PORT4>; /* lan port bitmap */
224+
switch_wan_bmp = <ESS_PORT5>; /* wan port bitmap */
225+
switch_mac_mode = <MAC_MODE_PSGMII>;
226+
227+
qcom,port_phyinfo {
228+
port@4 {
229+
port_id = <4>;
230+
phy_address = <3>;
231+
};
232+
233+
port@5 {
234+
port_id = <5>;
235+
phy_address = <4>;
236+
};
237+
};
238+
};
239+
240+
&dp4 {
241+
status = "okay";
242+
phy-handle = <&qca8075_3>;
243+
label = "lan";
244+
};
245+
246+
&dp5 {
247+
status = "okay";
248+
phy-handle = <&qca8075_4>;
249+
label = "wan";
250+
};
251+
252+
&wifi {
253+
status = "okay";
254+
qcom,ath11k-fw-memory-mode = <1>;
255+
qcom,ath11k-calibration-variant = "TPLink-Deco-X60-v2";
256+
};
257+
258+

target/linux/qualcommax/image/ipq807x.mk

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,3 +635,18 @@ define Device/zyxel_nwa210ax
635635
ZYXEL_MODEL_ID := 5c e1
636636
endef
637637
TARGET_DEVICES += zyxel_nwa210ax
638+
639+
define Device/tplink_deco-x60-v2
640+
$(call Device/FitImage)
641+
$(call Device/UbiFit)
642+
DEVICE_VENDOR := TP-Link
643+
DEVICE_MODEL := Deco X60
644+
DEVICE_VARIANT := v2
645+
BLOCKSIZE := 128k
646+
PAGESIZE := 2048
647+
DEVICE_DTS_CONFIG := config@ac04
648+
SOC := ipq8071
649+
DEVICE_PACKAGES := ipq-wifi-tplink_deco-x60-v2
650+
endef
651+
TARGET_DEVICES += tplink_deco-x60-v2
652+

target/linux/qualcommax/ipq807x/base-files/etc/board.d/02_network

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ ipq807x_setup_interfaces()
1515
edgecore,eap102|\
1616
tcl,linkhub-hh500v|\
1717
tplink,deco-x80-5g|\
18+
tplink,deco-x60-v2|\
1819
yuncore,ax880|\
1920
zte,mf269)
2021
ucidef_set_interfaces_lan_wan "lan" "wan"
@@ -103,7 +104,8 @@ ipq807x_setup_macs()
103104
wan_mac=$(mtd_get_mac_binary "0:ART" 0x5e290)
104105
lan_mac=$(mtd_get_mac_binary "0:ART" 0x5e296)
105106
;;
106-
tplink,deco-x80-5g)
107+
tplink,deco-x80-5g|\
108+
tplink,deco-x60-v2)
107109
label_mac=$(get_mac_binary /tmp/factory_data/default-mac 0)
108110
lan_mac=$(macaddr_add $label_mac 1)
109111
wan_mac=$label_mac

target/linux/qualcommax/ipq807x/base-files/etc/hotplug.d/firmware/11-ath11k-caldata

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,8 @@ case "$FIRMWARE" in
111111
ath11k_patch_mac $(mtd_get_mac_binary "0:ART" 0x5e2a2) 1
112112
ath11k_set_macflag
113113
;;
114-
tplink,deco-x80-5g)
114+
tplink,deco-x80-5g|\
115+
tplink,deco-x60-v2)
115116
caldata_extract "0:art" 0x1000 0x20000
116117
label_mac=$(get_mac_binary /tmp/factory_data/default-mac 0)
117118
ath11k_patch_mac $(macaddr_add $label_mac -1) 0

target/linux/qualcommax/ipq807x/base-files/lib/preinit/09_mount_factory_data

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ preinit_mount_factory_data() {
1818
preinit_mount_factory_partitions() {
1919

2020
case $(board_name) in
21-
tplink,deco-x80-5g)
21+
tplink,deco-x80-5g|\
22+
tplink,deco-x60-v2)
2223
preinit_mount_factory_data "factory_data"
2324
preinit_mount_factory_data "runtime_data"
2425
;;

target/linux/qualcommax/ipq807x/base-files/lib/upgrade/platform.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ platform_do_upgrade() {
271271
nand_do_upgrade "$1"
272272
;;
273273
tplink,deco-x80-5g|\
274+
tplink,deco-x60-v2|\
274275
tplink,eap620hd-v1|\
275276
tplink,eap660hd-v1)
276277
tplink_do_upgrade "$1"

0 commit comments

Comments
 (0)