qualcommax: ipq807x support Netgear Orbi Pro SXK80

This commit adds support for Netgear Orbi Pro SXR80 and SXS80 (collectively known as SXK80)

Specifications:
---------------
* CPU: Qualcomm IPQ8074A Quad core Cortex-A53
* RAM: 1024MB
* Storage: SPI-NAND 512 MiB (Winbond W29N04GZ)
* Ethernet: 4x 1G RJ45 ports (QCA8075) 1x 2.5G RJ45 LAN/WAN (QCA8081)
* WLAN:
    - 2.4 GHz: Qualcomm QCN5024 4x4
    - 2x 5 GHz: Qualcomm QCN5054 4x4 (second radio high channels only)
* LEDs:
    - Power: (Green and red)
    - Front: (Blue, green, red and white)
* Buttons:
    - 1x Soft reset
    - 1x Sync/WPS
* Power: 12V DC Jack

Installation instructions (Telnet):
-----------------------------------

*Note, this guide assumes SXR80, for SXS80 change the firmware file name as appropriate

1. Put firmware file openwrt-qualcommax-ipq807x-netgear_sxr80-initramfs-uImage.itb in root of TFTP server available at 192.168.1.10.
2. Enable telnet by going to http://[ip of device]/debug.htm and clicking on the tickbox 'Enable telnet'
3. Telnet into the device and login using the same username and password as the web interface:
4. Run the following command:

`fw_setenv bootcmd 'env default -a; saveenv; reset'`

5. Reboot the router, once the web interface is available again re-enable telnet via http://[ip of device]/debug.htm and telnet into the device.

6. Run the following command:

`fw_printenv`

It should look similar to the below:

```
baudrate=115200
bootargs=console=ttyMSM0,115200n8
bootcmd=mii write 0x0 0x0 0x800; sleep 1; nmrp; bootdni; boot_DNI_secureboot
bootdelay=2
ipaddr=192.168.1.1
netmask=255.255.255.0
serverip=192.168.1.10
soc_version_major=2
soc_version_minor=0
```

**If you see the message:**
`Warning: Bad CRC, using default environment`
**DO NOT CONTINUE, YOU WILL BRICK YOUR DEVICE**

7. Run the following command:

`fw_setenv originalboot 'mii write 0x0 0x0 0x800; sleep 1; nmrp; bootdni; boot_DNI_secureboot'`

(This should match what's in the bootcmd variable displayed in step 6)

8. Run the following commands:
```
fw_setenv wrttftp 'mii write 0x0 0x0 0x800; sleep 1; nmrp; if tftpboot openwrt-qualcommax-ipq807x-netgear_sxr80-initramfs-uImage.itb; then bootm; fi; bootdni; boot_DNI_secureboot'
fw_setenv wrtboot 'mii write 0x0 0x0 0x800; sleep 1; nmrp; nand read 0x40000000 0x1980000 0x06d00000; bootm 0x40000000'
fw_setenv bootcmd 'run wrttftp'
```

9. Ensure SXR/S device is attached via ethernet (LAN port) to the same ethernet segment as the TFTP server.

10. Reboot the device, it should reboot into OpenWrt and be available on 192.168.1.1

11. Once OpenWrt has booted, update the bootcmd using the following command:

`fw_setenv bootcmd 'run wrtboot'`

12. Flash the sysupgrade image

13. It should boot into OpenWrt

References to SXK80 GPL source:
https://www.downloads.netgear.com/files/GPL/SXK80-V3.2.0.108_gpl_src.tar.bz2.zip

Signed-off-by: Flole Systems <flole@flole.de>
Signed-off-by: Andrew Smith <gul.code@outlook.com>
Link: https://github.com/openwrt/openwrt/pull/14939
Signed-off-by: Robert Marko <robimarko@gmail.com>
This commit is contained in:
Andrew Smith 2023-08-21 09:48:45 +01:00 committed by Robert Marko
parent 01048c7456
commit 0f5c28b96b
11 changed files with 615 additions and 0 deletions

View File

@ -37,6 +37,12 @@ linksys,mx8500)
[ -n "$idx" ] && \
ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x40000" "0x20000" "2"
;;
netgear,sxr80|\
netgear,sxs80)
idx="$(find_mtd_index 0:appsblenv)"
[ -n "$idx" ] && \
ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x40000" "0x20000"
;;
redmi,ax6|\
xiaomi,ax3600|\
xiaomi,ax9000)

View File

@ -40,6 +40,7 @@ ALLWIFIBOARDS:= \
linksys_mx8500 \
netgear_lbr20 \
netgear_rax120v2 \
netgear_sxk80 \
netgear_wax214 \
netgear_wax218 \
netgear_wax620 \
@ -161,6 +162,7 @@ $(eval $(call generate-ipq-wifi-package,linksys_mx5300,Linksys MX5300))
$(eval $(call generate-ipq-wifi-package,linksys_mx8500,Linksys MX8500))
$(eval $(call generate-ipq-wifi-package,netgear_lbr20,Netgear LBR20))
$(eval $(call generate-ipq-wifi-package,netgear_rax120v2,Netgear RAX120v2))
$(eval $(call generate-ipq-wifi-package,netgear_sxk80,Netgear SXK80))
$(eval $(call generate-ipq-wifi-package,netgear_wax214,Netgear WAX214))
$(eval $(call generate-ipq-wifi-package,netgear_wax218,Netgear WAX218))
$(eval $(call generate-ipq-wifi-package,netgear_wax620,Netgear WAX620))

View File

@ -216,6 +216,7 @@ CONFIG_IRQ_FASTEOI_HIERARCHY_HANDLERS=y
CONFIG_IRQ_FORCED_THREADING=y
CONFIG_IRQ_WORK=y
# CONFIG_KPSS_XCC is not set
CONFIG_LEDS_TLC591XX=y
CONFIG_LIBFDT=y
CONFIG_LOCK_DEBUGGING_SUPPORT=y
CONFIG_LOCK_SPIN_ON_OWNER=y
@ -441,6 +442,7 @@ CONFIG_RANDSTRUCT_NONE=y
CONFIG_RAS=y
CONFIG_RATIONAL=y
CONFIG_REGMAP=y
CONFIG_REGMAP_I2C=y
CONFIG_REGMAP_MMIO=y
CONFIG_REGULATOR=y
# CONFIG_REGULATOR_CPR3 is not set

View File

@ -0,0 +1,541 @@
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
/*
* Copyright (c) 2021, Flole <flole@flole.de>
* Copyright (c) 2023, Andrew Smith <gul.code@outlook.com>
*/
/dts-v1/;
#include "ipq8074.dtsi"
#include "ipq8074-ess.dtsi"
#include "ipq8074-hk-cpu.dtsi"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
#include <dt-bindings/leds/common.h>
/ {
aliases {
serial0 = &blsp1_uart5;
led-boot = &led_front_blue;
led-failsafe = &led_front_red;
led-running = &led_front_green;
led-upgrade = &led_front_white;
label-mac-device = &dp2;
};
chosen {
stdout-path = "serial0:115200n8";
bootargs-append = " ubi.mtd=rootfs root=/dev/ubiblock0_0";
};
keys {
compatible = "gpio-keys";
reset {
label = "reset";
gpios = <&tlmm 54 GPIO_ACTIVE_LOW>;
linux,code = <KEY_RESTART>;
};
wps {
label = "wps";
gpios = <&tlmm 57 GPIO_ACTIVE_LOW>;
linux,code = <KEY_WPS_BUTTON>;
};
};
leds {
compatible = "gpio-leds";
led_front_blue: front-blue {
function = LED_FUNCTION_STATUS;
gpios = <&tlmm 33 GPIO_ACTIVE_LOW>;
color = <LED_COLOR_ID_BLUE>;
};
led_front_green: front-green {
function = LED_FUNCTION_STATUS;
gpios = <&tlmm 29 GPIO_ACTIVE_LOW>;
color = <LED_COLOR_ID_GREEN>;
};
led_front_red: front-red {
function = LED_FUNCTION_STATUS;
gpios = <&tlmm 31 GPIO_ACTIVE_LOW>;
color = <LED_COLOR_ID_RED>;
};
led_front_white: front-white {
function = LED_FUNCTION_STATUS;
gpios = <&tlmm 26 GPIO_ACTIVE_LOW>;
color = <LED_COLOR_ID_WHITE>;
};
led_power_green: power-green {
function = LED_FUNCTION_POWER;
gpios = <&tlmm 21 GPIO_ACTIVE_LOW>;
color = <LED_COLOR_ID_GREEN>;
default-state = "on";
};
led_power_red: power-red {
function = LED_FUNCTION_POWER;
gpios = <&tlmm 22 GPIO_ACTIVE_LOW>;
color = <LED_COLOR_ID_RED>;
panic-indicator;
};
};
};
&tlmm {
mdio_pins: mdio-pins {
mdc {
pins = "gpio68";
function = "mdc";
drive-strength = <8>;
bias-pull-up;
};
mdio {
pins = "gpio69";
function = "mdio";
drive-strength = <8>;
bias-pull-up;
};
};
leds_pins: leds_pinmux {
led_power_green {
pins = "gpio21";
function = "gpio";
drive-strength = <8>;
bias-pull-down;
};
led_power_red {
pins = "gpio22";
function = "gpio";
drive-strength = <8>;
bias-pull-down;
};
led_white {
pins = "gpio26";
function = "gpio";
drive-strength = <8>;
bias-pull-down;
};
led_green {
pins = "gpio29";
function = "gpio";
drive-strength = <8>;
bias-pull-down;
};
led_red {
pins = "gpio31";
function = "gpio";
drive-strength = <8>;
bias-pull-down;
};
led_blue {
pins = "gpio33";
function = "gpio";
drive-strength = <8>;
bias-pull-down;
};
};
};
&blsp1_uart5 {
status = "okay";
};
&blsp1_i2c2 {
pinctrl-0 = <&i2c_0_pins>;
pinctrl-names = "default";
status = "okay";
tlc59208f@27 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "ti,tlc59108";
reg = <0x27>;
led@0 {
label = "rgb:led0";
reg = <0>;
linux,default-trigger = "default-off";
};
led@1 {
label = "rgb:led1";
reg = <1>;
linux,default-trigger = "default-off";
};
led@2 {
label = "rgb:led2";
reg = <2>;
linux,default-trigger = "default-off";
};
led@3 {
label = "rgb:led3";
reg = <3>;
linux,default-trigger = "default-off";
};
};
};
&prng {
status = "okay";
};
&cryptobam {
status = "okay";
};
&crypto {
status = "okay";
};
&qpic_bam {
status = "okay";
};
&qpic_nand {
status = "okay";
/*
* Bootloader will find the NAND DT node by the compatible and
* then "fixup" it by adding the partitions from the SMEM table
* using the legacy bindings thus making it impossible for us
* to change the partition table or utilize NVMEM for calibration.
* So add a dummy partitions node that bootloader will populate
* and set it as disabled so the kernel ignores it instead of
* printing warnings due to the broken way bootloader adds the
* partitions.
*/
partitions {
status = "disabled";
};
nand@0 {
reg = <0>;
nand-ecc-strength = <4>;
nand-ecc-step-size = <512>;
nand-bus-width = <8>;
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
partition@0 {
label = "0:sbl1";
reg = <0x00 0x100000>;
read-only;
};
partition@100000 {
label = "0:mibib";
reg = <0x100000 0x100000>;
read-only;
};
partition@200000 {
label = "0:bootconfig";
reg = <0x200000 0x80000>;
read-only;
};
partition@280000 {
label = "0:bootconfig_1";
reg = <0x280000 0x80000>;
read-only;
};
partition@300000 {
label = "0:qsee";
reg = <0x300000 0x300000>;
read-only;
};
partition@600000 {
label = "0:qsee_1";
reg = <0x600000 0x300000>;
read-only;
};
partition@900000 {
label = "0:devcfg";
reg = <0x900000 0x80000>;
read-only;
};
partition@980000 {
label = "0:devcfg_1";
reg = <0x980000 0x80000>;
read-only;
};
partition@a00000 {
label = "0:apdp";
reg = <0xa00000 0x80000>;
read-only;
};
partition@a80000 {
label = "0:apdp_1";
reg = <0xa80000 0x80000>;
read-only;
};
partition@b00000 {
label = "0:rpm";
reg = <0xb00000 0x80000>;
read-only;
};
partition@b80000 {
label = "0:rpm_1";
reg = <0xb80000 0x80000>;
read-only;
};
partition@c00000 {
label = "0:cdt";
reg = <0xc00000 0x80000>;
read-only;
};
partition@c80000 {
label = "0:cdt_1";
reg = <0xc80000 0x80000>;
read-only;
};
partition@d00000 {
label = "0:appsblenv";
reg = <0xd00000 0x80000>;
};
partition@d80000 {
label = "0:appsbl";
reg = <0xd80000 0x100000>;
read-only;
};
partition@e80000 {
label = "0:appsbl_1";
reg = <0xe80000 0x100000>;
read-only;
};
partition@f80000 {
label = "0:art";
reg = <0xf80000 0x80000>;
read-only;
};
partition@1000000 {
label = "0:art.bak";
reg = <0x1000000 0x80000>;
read-only;
};
partition@1080000 {
label = "config";
reg = <0x1080000 0x100000>;
};
partition@1180000 {
label = "boarddata1";
reg = <0x1180000 0x100000>;
nvmem-layout {
compatible = "fixed-layout";
#address-cells = <1>;
#size-cells = <1>;
macaddr_boarddata1_0: macaddr@0 {
reg = <0x0 0x6>;
};
macaddr_boarddata1_6: macaddr@6 {
reg = <0x6 0x6>;
};
};
};
partition@1280000 {
label = "boarddata2";
reg = <0x1280000 0x100000>;
};
partition@1380000 {
label = "pot";
reg = <0x1380000 0x100000>;
read-only;
};
partition@1480000 {
label = "dnidata";
reg = <0x1480000 0x500000>;
read-only;
};
partition@1980000 {
label = "kernel";
reg = <0x1980000 0x620000>;
};
partition@1fa0000 {
label = "rootfs";
reg = <0x1fa0000 0x66e0000>;
};
partition@8680000 {
label = "kernel2";
reg = <0x8680000 0x620000>;
read-only;
};
partition@8ca0000 {
label = "rootfs2";
reg = <0x8ca0000 0x66e0000>;
read-only;
};
};
};
};
&mdio {
status = "okay";
pinctrl-0 = <&mdio_pins>;
pinctrl-names = "default";
reset-gpios = <&tlmm 37 GPIO_ACTIVE_LOW>;
ethernet-phy-package@0 {
#address-cells = <1>;
#size-cells = <0>;
reg = <0>;
compatible = "qcom,qca8075-package";
qca8075_1: ethernet-phy@1 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <1>;
};
qca8075_2: ethernet-phy@2 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <2>;
};
qca8075_3: ethernet-phy@3 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <3>;
};
qca8075_4: ethernet-phy@4 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <4>;
};
};
qca8081_28: ethernet-phy@28 {
compatible = "ethernet-phy-id004d.d101";
reg = <28>;
reset-deassert-us = <10000>;
reset-gpios = <&tlmm 25 GPIO_ACTIVE_LOW>;
};
};
&switch {
status = "okay";
switch_lan_bmp = <(ESS_PORT2 | ESS_PORT3 | ESS_PORT4 | ESS_PORT5)>; /* lan port bitmap */
switch_wan_bmp = <ESS_PORT6>; /* wan port bitmap */
switch_mac_mode = <MAC_MODE_PSGMII>; /* mac mode for uniphy instance0*/
switch_mac_mode2 = <MAC_MODE_SGMII_PLUS>; /* mac mode for uniphy instance2*/
qcom,port_phyinfo {
port@2 {
port_id = <2>;
phy_address = <1>;
};
port@3 {
port_id = <3>;
phy_address = <2>;
};
port@4 {
port_id = <4>;
phy_address = <3>;
};
port@5 {
port_id = <5>;
phy_address = <4>;
};
port@6 {
port_id = <6>;
phy_address = <28>;
port_mac_sel = "QGMAC_PORT";
};
};
};
&edma {
status = "okay";
};
&dp2 {
status = "okay";
phy-handle = <&qca8075_1>;
label = "lan2";
nvmem-cells = <&macaddr_boarddata1_0>;
nvmem-cell-names = "mac-address";
};
&dp3 {
status = "okay";
phy-handle = <&qca8075_2>;
label = "lan3";
nvmem-cells = <&macaddr_boarddata1_0>;
nvmem-cell-names = "mac-address";
};
&dp4 {
status = "okay";
phy-handle = <&qca8075_3>;
label = "lan4";
nvmem-cells = <&macaddr_boarddata1_0>;
nvmem-cell-names = "mac-address";
};
&dp5 {
status = "okay";
phy-handle = <&qca8075_4>;
label = "lan5";
nvmem-cells = <&macaddr_boarddata1_0>;
nvmem-cell-names = "mac-address";
};
&dp6 {
status = "okay";
phy-handle = <&qca8081_28>;
label = "wan";
nvmem-cells = <&macaddr_boarddata1_6>;
nvmem-cell-names = "mac-address";
};
&wifi {
status = "okay";
qcom,ath11k-calibration-variant = "Netgear-SXK80";
};

View File

@ -0,0 +1,11 @@
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
/* Copyright (c) 2021, Flole <flole@flole.de> */
/dts-v1/;
#include "ipq8074-sxk80.dtsi"
/ {
model = "Netgear SXR80";
compatible = "netgear,sxr80", "qcom,ipq8074";
};

View File

@ -0,0 +1,11 @@
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
/* Copyright (c) 2021, Flole <flole@flole.de> */
/dts-v1/;
#include "ipq8074-sxk80.dtsi"
/ {
model = "Netgear SXS80";
compatible = "netgear,sxs80", "qcom,ipq8074";
};

View File

@ -172,6 +172,33 @@ define Device/netgear_rax120v2
endef
TARGET_DEVICES += netgear_rax120v2
define Device/netgear_sxk80
$(call Device/FitImage)
$(call Device/UbiFit)
DEVICE_PACKAGES += ipq-wifi-netgear_sxk80
DEVICE_VENDOR := Netgear
BLOCKSIZE := 128k
PAGESIZE := 2048
DEVICE_DTS_CONFIG := config@hk01
SOC := ipq8074
KERNEL_SIZE := 6272k
NETGEAR_HW_ID := 29766265+0+512+1024+4x4+4x4+4x4
endef
define Device/netgear_sxr80
$(call Device/netgear_sxk80)
DEVICE_MODEL := SXR80
NETGEAR_BOARD_ID := SXR80
endef
TARGET_DEVICES += netgear_sxr80
define Device/netgear_sxs80
$(call Device/netgear_sxk80)
DEVICE_MODEL := SXS80
NETGEAR_BOARD_ID := SXS80
endef
TARGET_DEVICES += netgear_sxs80
define Device/netgear_wax218
$(call Device/FitImage)
$(call Device/UbiFit)

View File

@ -43,6 +43,10 @@ ipq807x_setup_interfaces()
netgear,rax120v2)
ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4 lan5" "wan"
;;
netgear,sxr80|\
netgear,sxs80)
ucidef_set_interfaces_lan_wan "lan2 lan3 lan4 lan5" "wan"
;;
netgear,wax218|\
netgear,wax620)
ucidef_set_interface_lan "lan" "dhcp"

View File

@ -17,6 +17,8 @@ case "$FIRMWARE" in
edgecore,eap102|\
edimax,cax1800|\
linksys,mx5300|\
netgear,sxr80|\
netgear,sxs80|\
netgear,wax218|\
netgear,wax620|\
netgear,wax630|\

View File

@ -23,6 +23,13 @@ case "$board" in
[ "$PHYNBR" = "0" ] && macaddr_add $(get_mac_label) 2 > /sys${DEVPATH}/macaddress
[ "$PHYNBR" = "1" ] && macaddr_add $(get_mac_label) 3 > /sys${DEVPATH}/macaddress
;;
netgear,sxr80|\
netgear,sxs80)
[ "$PHYNBR" = "0" ] && mtd_get_mac_binary boarddata1 0x0c > /sys${DEVPATH}/macaddress
#boarddata1 doesn't have a MAC for the 2G interface
[ "$PHYNBR" = "1" ] && macaddr_setbit_la $(get_mac_label) > /sys${DEVPATH}/macaddress
[ "$PHYNBR" = "2" ] && mtd_get_mac_binary boarddata1 0x12 > /sys${DEVPATH}/macaddress
;;
zbtlink,zbt-z800ax)
[ "$PHYNBR" = "0" ] && macaddr_add $(get_mac_label) -1 > /sys${DEVPATH}/macaddress
[ "$PHYNBR" = "1" ] && macaddr_add $(get_mac_label) -2 > /sys${DEVPATH}/macaddress

View File

@ -49,6 +49,8 @@ platform_do_upgrade() {
dynalink,dl-wrx36|\
edimax,cax1800|\
netgear,rax120v2|\
netgear,sxr80|\
netgear,sxs80|\
netgear,wax218|\
netgear,wax620|\
netgear,wax630|\