IPQ806x NSS Drivers

Had a quick look at the logs posted by @jack338c. Between the 2 builds he tested (Dec & Jan), the kernel version has changed. So it could be one of 2 issues that I can think of:

  1. Changes to the kernel that caused the kernel panic.
  2. Changes to the EA7500 .dts file

I don't think the NSS GMAC source was patched?

The stack trace shows kernel panic when trying to load the GMAC driver.

@ACwifidude
I tired use Dec's qcom-ipq8064-eax500.dtsi and qcom-ipq8064-ea7500-v1.dts instead of Jan's one ,then rebuilt,but it will still auto-reboot after 10 seconds

thanks

There is one added gmac patch for ipq8064 devices. It is included in both build versions - otherwise gmac is the same. The .dts files have the same parameters between the builds - (majority of changes are in the .dtsi files for simplicity sake - less files to edit).

Big changes in the newer version:

  1. a month of master changes
  2. doesn’t have Ansuel’s experimental L2 cache fab scaling commits from his branch.
  3. This patch looks like it needs some edits - it is referring to ipq8064.dtsi (? This file doesn’t exist any more - it is now the version 2 file).... this patch is in both versions so is likely not the source of the issue
  1. I included this @KONG patch for gmac (both versions have it - this patch fixed the constant reboots before for ipq8064 devices)

If you are wondering if the NSS effort is progressing when it comes to stability, I would say yes in a big way. Like most people I used to have good performance, but reboot on a daily base or every few days. Back in November I've built an image with some help from @ACwifidude and I'm happy to report that the router was running stable for more than 60 days in a row
Unfortunately my lucky streak has ended today. While trying to access Luci this morning, the router rebooted:


BusyBox v1.31.1 () built-in shell (ash)

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 OpenWrt SNAPSHOT, r14530+605-9085343
 -----------------------------------------------------

root@openwrt:~# uptime
 10:09:20 **up 61 days, 14:04**,  load average: 0.00, 0.00, 0.00
root@openwrt:~# client_loop: send disconnect: Broken pipe
#


BusyBox v1.31.1 () built-in shell (ash)

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 OpenWrt SNAPSHOT, r14530+605-9085343
 -----------------------------------------------------
root@openwrt:~# uptime
 10:12:25 up 0 min,  load average: 2.23, 0.58, 0.19

root@openwrt:~# uptime
 10:13:50 up 2 min,  load average: 0.53, 0.43, 0.17
root@openwrt:~#
2 Likes

EA7500 v1 and ea8500 with NSS driver are all working on ACwifidude's repo "OpenWrt SNAPSHOT r15598-c840f8c16a / LuCI Master git-21.016.32520-34e2d6e" Kernel Version 5.4.89
the speed up is impressive,but it's not lucky like R7800 have uptime 60days,it will auto-reboot less than 24 hours

Could you @Ansuel try to fix it? needs your help,Thank you

and here are dts file from you and @ACwifidude
qcom-ipq8064-eax500.dtsi

// SPDX-License-Identifier: GPL-2.0-or-later OR MIT

#include "qcom-ipq8064-v2.0.dtsi"

#include <dt-bindings/input/input.h>

/ {
	chosen {
		bootargs = "console=ttyMSM0,115200n8";
		/* append to bootargs adding the root deviceblock nbr from bootloader */
		append-rootblock = "ubi.mtd=";
	};
};

&usb3_0 {
	status = "okay";
};

&usb3_1 {
	status = "okay";
};

&pcie0 {
	status = "okay";

	max-link-speed = <1>;
};

&pcie1 {
	status = "okay";
};

&pcie2 {
	status = "okay";
};

&nand_controller {
	status = "okay";

	pinctrl-0 = <&nand_pins>;
	pinctrl-names = "default";

	nand@0 {
		reg = <0>;
		compatible = "qcom,nandcs";

		nand-ecc-strength = <4>;
		nand-bus-width = <8>;
		nand-ecc-step-size = <512>;

		partitions: partitions {
			compatible = "fixed-partitions";
			#address-cells = <1>;
			#size-cells = <1>;

			partition@0 {
				label = "SBL1";
				reg = <0x0000000 0x0040000>;
				read-only;
			};

			partition@40000 {
				label = "MIBIB";
				reg = <0x0040000 0x0140000>;
				read-only;
			};

			partition@180000 {
				label = "SBL2";
				reg = <0x0180000 0x0140000>;
				read-only;
			};

			partition@2c0000 {
				label = "SBL3";
				reg = <0x02c0000 0x0280000>;
				read-only;
			};

			partition@540000 {
				label = "DDRCONFIG";
				reg = <0x0540000 0x0120000>;
				read-only;
			};

			partition@660000 {
				label = "SSD";
				reg = <0x0660000 0x0120000>;
				read-only;
			};

			partition@780000 {
				label = "TZ";
				reg = <0x0780000 0x0280000>;
				read-only;
			};

			partition@a00000 {
				label = "RPM";
				reg = <0x0a00000 0x0280000>;
				read-only;
			};

			art: partition@c80000 {
				label = "art";
				reg = <0x0c80000 0x0140000>;
				read-only;
			};

			partition@dc0000 {
				label = "APPSBL";
				reg = <0x0dc0000 0x0100000>;
				read-only;
			};

			partition@ec0000 {
				label = "u_env";
				reg = <0x0ec0000 0x0040000>;
			};

			partition@f00000 {
				label = "s_env";
				reg = <0x0f00000 0x0040000>;
			};

			partition@f40000 {
				label = "devinfo";
				reg = <0x0f40000 0x0040000>;
			};

			partition@f80000 {
				label = "kernel1";
				reg = <0x0f80000 0x2800000>;  /* 3 MB spill to rootfs */
			};

			partition@1280000 {
				label = "rootfs1";
				reg = <0x1280000 0x2500000>;
			};

			partition@3780000 {
				label = "kernel2";
				reg = <0x3780000 0x2800000>;
			};

			partition@3a80000 {
				label = "rootfs2";
				reg = <0x3a80000 0x2500000>;
			};
		};
	};
};

&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 */
			0x00010 0x2613a0    /* PWS_REG */
			0x000e4 0x6a545     /* MAC_POWER_SEL */
			0x000e0 0xc74164de  /* SGMII_CTRL */
			0x0007c 0x4e        /* PORT0_STATUS */
			0x00094 0x4e        /* PORT6_STATUS */
			>;
	};
};

&gmac1 {
	status = "okay";
	compatible = "qcom,nss-gmac";
	reg = <0x37200000 0x200000>;
	interrupts = <GIC_SPI 223 IRQ_TYPE_LEVEL_HIGH>;
	phy-mode = "rgmii";
	qcom,id = <1>;
	qcom,pcs-chanid = <0>;
	qcom,phy-mdio-addr = <0>;
	qcom,poll-required = <0>;
	qcom,rgmii-delay = <1>;
	qcom,phy_mii_type = <0>;
	qcom,emulation = <0>;
	qcom,forced-speed = <1000>;
	qcom,forced-duplex = <1>;
	qcom,socver = <0>;
	qcom,irq = <255>;
	mdiobus = <&mdio0>;

	pinctrl-0 = <&rgmii2_pins>;
	pinctrl-names = "default";

	fixed-link {
		speed = <1000>;
		full-duplex;
	};
};

&gmac2 {
	status = "okay";
	compatible = "qcom,nss-gmac";
	reg = <0x37400000 0x200000>;
	interrupts = <GIC_SPI 226 IRQ_TYPE_LEVEL_HIGH>;
	phy-mode = "sgmii";
	qcom,id = <2>;
	qcom,pcs-chanid = <1>;
	qcom,phy-mdio-addr = <4>;
	qcom,poll-required = <0>;	/* no polling */
	qcom,rgmii-delay = <0>;
	qcom,phy_mii_type = <1>;
	qcom,emulation = <0>;
	qcom,forced-speed = <1000>;
	qcom,forced-duplex = <1>;
	qcom,socver = <0>;
	qcom,irq = <258>;
	mdiobus = <&mdio0>;

	fixed-link {
		speed = <1000>;
		full-duplex;
	};
};

&adm_dma {
	status = "okay";
};

qcom-ipq8064-ea8500.dts

#include "qcom-ipq8064-eax500.dtsi"

/ {
	model = "Linksys EA8500 WiFi Router";
	compatible = "linksys,ea8500", "qcom,ipq8064";

	memory@0 {
		reg = <0x42000000 0x1e000000>;
		device_type = "memory";
	};

	aliases {
		mdio-gpio0 = &mdio0;

		led-boot = &led_power;
		led-failsafe = &led_power;
		led-running = &led_power;
		led-upgrade = &led_power;
	};

	keys {
		compatible = "gpio-keys";
		pinctrl-0 = <&button_pins>;
		pinctrl-names = "default";

		wifi {
			label = "wifi";
			gpios = <&qcom_pinmux 67 GPIO_ACTIVE_LOW>;
			linux,code = <KEY_RFKILL>;
		};

		reset {
			label = "reset";
			gpios = <&qcom_pinmux 68 GPIO_ACTIVE_LOW>;
			linux,code = <KEY_RESTART>;
		};

		wps {
			label = "wps";
			gpios = <&qcom_pinmux 65 GPIO_ACTIVE_LOW>;
			linux,code = <KEY_WPS_BUTTON>;
		};
	};

	leds {
		compatible = "gpio-leds";
		pinctrl-0 = <&led_pins>;
		pinctrl-names = "default";

		wps {
			label = "green:wps";
			gpios = <&qcom_pinmux 53 GPIO_ACTIVE_HIGH>;
		};

		led_power: power {
			label = "white:power";
			gpios = <&qcom_pinmux 6 GPIO_ACTIVE_LOW>;
			default-state = "keep";
		};

		wifi {
			label = "green:wifi";
			gpios = <&qcom_pinmux 54 GPIO_ACTIVE_HIGH>;
		};
	};
};

&qcom_pinmux {
	button_pins: button_pins {
		mux {
			pins = "gpio65", "gpio67", "gpio68";
			function = "gpio";
			drive-strength = <2>;
			bias-pull-up;
		};
	};

	led_pins: led_pins {
		mux {
			pins = "gpio6", "gpio53", "gpio54";
			function = "gpio";
			drive-strength = <2>;
			bias-pull-up;
		};
	};
};

&sata_phy {
	status = "okay";
};

&sata {
	status = "okay";
};

&partitions {
	partition@5f80000 {
		label = "syscfg";
		reg = <0x5f80000 0x2080000>;
	};
};

&mdio0 {
	phy4: ethernet-phy@4 {
		reg = <4>;
	};
};

&gmac1 {
	qcom,phy_mdio_addr = <4>;
	qcom,poll_required = <1>;
	qcom,rgmii_delay = <0>;
	qcom,emulation = <0>;
};

/* LAN */
&gmac2 {
	qcom,phy_mdio_addr = <0>;	/* none */
	qcom,poll_required = <0>;	/* no polling */
	qcom,rgmii_delay = <0>;
	qcom,emulation = <0>;
};

qcom-ipq8064-ea7500-v1.dts

// SPDX-License-Identifier: GPL-2.0-or-later OR MIT

#include "qcom-ipq8064-eax500.dtsi"

/ {
	model = "Linksys EA7500 V1 WiFi Router";
	compatible = "linksys,ea7500-v1", "qcom,ipq8064";

	memory@0 {
		reg = <0x42000000 0xe000000>;
		device_type = "memory";
	};

	aliases {
		led-boot = &led_power;
		led-failsafe = &led_power;
		led-running = &led_power;
		led-upgrade = &led_power;
	};

	chosen {
		/* look for root deviceblock nbr in this bootarg */
		find-rootblock = "ubi.mtd=";
	};

	keys {
		compatible = "gpio-keys";
		pinctrl-0 = <&button_pins>;
		pinctrl-names = "default";

		reset {
			label = "reset";
			gpios = <&qcom_pinmux 68 GPIO_ACTIVE_LOW>;
			linux,code = <KEY_RESTART>;
		};

		wps {
			label = "wps";
			gpios = <&qcom_pinmux 65 GPIO_ACTIVE_LOW>;
			linux,code = <KEY_WPS_BUTTON>;
		};
	};

	leds {
		compatible = "gpio-leds";
		pinctrl-0 = <&led_pins>;
		pinctrl-names = "default";

		led_power: power {
			label = "white:power";
			gpios = <&qcom_pinmux 6 GPIO_ACTIVE_LOW>;
			default-state = "keep";
		};
	};
};

&qcom_pinmux {
	button_pins: button_pins {
		mux {
			pins = "gpio65", "gpio68";
			function = "gpio";
			drive-strength = <2>;
			bias-pull-up;
		};
	};

	led_pins: led_pins {
		mux {
			pins = "gpio6";
			function = "gpio";
			drive-strength = <2>;
			bias-pull-up;
		};
	};
};

&partitions {
	partition@5f80000 {
		label = "sysdiag";
		reg = <0x5f80000 0x100000>;
	};

	partition@6080000 {
		label = "syscfg";
		reg = <0x6080000 0x1f80000>;
	};
};

&mdio0 {
	phy4: ethernet-phy@4 {
		reg = <4>;
	};
};

&gmac1 {
	qcom,phy_mdio_addr = <4>;
	qcom,poll_required = <1>;
	qcom,rgmii_delay = <0>;
	qcom,emulation = <0>;
};

/* LAN */
&gmac2 {
	qcom,phy_mdio_addr = <0>;	/* none */
	qcom,poll_required = <0>;	/* no polling */
	qcom,rgmii_delay = <0>;
	qcom,emulation = <0>;
};

the router freeze or we have some crashlog?

but this should already be fixed o.O also you said the reboot was after 24 hours

His ea7500v1 seems to not be making it more than about 10 seconds. I’ll work on it more this weekend.

and he still have that kernel panic? that should be easily fixable

Yep. Something with the gmac driver. It seems to only be with ipq8064 devices. This is the patch introduced to fix gmac issues (it is in both builds)

The only difference I can see is the infamous command line override bug from a couple weeks ago (most recent build is the same as master, older build had it turned off like this commit)

2 issues of ea7500 v1 and ea8500
1The latest repo from @ACwifidude https://github.com/ACwifidude/openwrt have kernel panic issue ,
2 The previous repo (OpenWrt SNAPSHOT r15598-c840f8c16a / LuCI Master git-21.016.32520-34e2d6e" Kernel Version 5.4.89) is ok,but it will reboot between 15~24hours.it happens when I was sleeping.

the router just reboot ,and It happens at Late Night while I was sleeping
I will try get the log later
thanks

I'm going to try asking again, anyone of you running webservers on LAN and have forwards to those working both internally and externally?
I think based on previous discussion that the NSS iptables handling makes the traffic not reach the destination properly.

What I found is that if LAN interface is set to Promiscuous mode it works.

There are several people with this issue. Anything special you had to do with setting up promiscuous mode?

I just noticed it statrted to work when I ran tcpdump to try to see what was going on.
tcpdump sets the interfaces to promiscuous mode.

You could use something like "ifconfig br-lan promisc" to set it, i'm however not sure which interface you need to set it on.
Use ifconfig br-lan -promisc to disable it.

Hi @Ansuel
I tried clone your repo and copy some files from @ACwifidude for my ea7500 v1 and do ./scripts/feeds update -a && ./scripts/feeds install -a to built it
but still got kernel panic issue(autoreboot) .ACwifidude's last firmware for ea7500 also have this issue

Could you help tell me to fix the kernel panic issue ,thanks
and I can't got crash logs I mention it last time,because nothing happen after reboot

All - I noticed that the 5.4.97 kernel update breaks one of the nss patches, namely: target/linux/ipq806x/patches-5.4/999-03a-qca-nss-ecm-support.patch

I took a stab at fixing it here.

I was able to successfully build my image with that patch. Feedback before I flash?

For reference, here is PR I submitted updating to 5.4.97.

EDIT: applying my fix above gave a bootable system/NSS appears functional based on my speedtests.

1 Like

@ACwifidude Trying to build your latest NSS stuff for R7800 I get the following error:

make[4]: Entering directory '/home/sumo/builds/openwrt/build_dir/target-arm_cortex-a15+neon-vfpv4_musl_eabi/linux-ipq806x_generic/backports-5.8.18-1'
make[5]: 'Kconfig.versions' is up to date.
make[7]: 'Kconfig.versions' is up to date.
make[8]: 'conf' is up to date.
boolean symbol CRYPTO_LIB_ARC4 tested for 'm'? test forced to 'n'
#
# configuration written to .config
#
Building backport-include/backport/autoconf.h ... done.
  CC [M]  /home/sumo/builds/openwrt/build_dir/target-arm_cortex-a15+neon-vfpv4_musl_eabi/linux-ipq806x_generic/backports-5.8.18-1/net/mac80211/rx.o
/home/sumo/builds/openwrt/build_dir/target-arm_cortex-a15+neon-vfpv4_musl_eabi/linux-ipq806x_generic/backports-5.8.18-1/net/mac80211/rx.c: In function 'netif_rx_nss':
/home/sumo/builds/openwrt/build_dir/target-arm_cortex-a15+neon-vfpv4_musl_eabi/linux-ipq806x_generic/backports-5.8.18-1/net/mac80211/rx.c:2562:25: error: 'struct ieee80211_sub_if_data' has no member named 'rx_queue'; did you mean 'skb_queue'?
  skb_queue_tail(&sdata->rx_queue, skb);
                         ^~~~~~~~
                         skb_queue
/home/sumo/builds/openwrt/build_dir/target-arm_cortex-a15+neon-vfpv4_musl_eabi/linux-ipq806x_generic/backports-5.8.18-1/net/mac80211/rx.c:2564:24: error: 'struct ieee80211_sub_if_data' has no member named 'rx_work'; did you mean 'work'?
  schedule_work(&sdata->rx_work);
                        ^~~~~~~
                        work
/home/sumo/builds/openwrt/build_dir/target-arm_cortex-a15+neon-vfpv4_musl_eabi/linux-ipq806x_generic/backports-5.8.18-1/net/mac80211/rx.c: In function 'ieee80211_invoke_fast_rx':
/home/sumo/builds/openwrt/build_dir/target-arm_cortex-a15+neon-vfpv4_musl_eabi/linux-ipq806x_generic/backports-5.8.18-1/net/mac80211/rx.c:4301:32: warning: unused variable 'sdata' [-Wunused-variable]
  struct ieee80211_sub_if_data *sdata = rx->sdata;
                                ^~~~~
make[9]: *** [scripts/Makefile.build:262: /home/sumo/builds/openwrt/build_dir/target-arm_cortex-a15+neon-vfpv4_musl_eabi/linux-ipq806x_generic/backports-5.8.18-1/net/mac80211/rx.o] Error 1
make[8]: *** [scripts/Makefile.build:496: /home/sumo/builds/openwrt/build_dir/target-arm_cortex-a15+neon-vfpv4_musl_eabi/linux-ipq806x_generic/backports-5.8.18-1/net/mac80211] Error 2
make[7]: *** [Makefile:1732: /home/sumo/builds/openwrt/build_dir/target-arm_cortex-a15+neon-vfpv4_musl_eabi/linux-ipq806x_generic/backports-5.8.18-1] Error 2
make[6]: *** [Makefile.build:13: modules] Error 2
make[5]: *** [Makefile.real:93: modules] Error 2
make[4]: *** [Makefile:121: modules] Error 2
make[4]: Leaving directory '/home/sumo/builds/openwrt/build_dir/target-arm_cortex-a15+neon-vfpv4_musl_eabi/linux-ipq806x_generic/backports-5.8.18-1'
make[3]: *** [Makefile:570: /home/sumo/builds/openwrt/build_dir/target-arm_cortex-a15+neon-vfpv4_musl_eabi/linux-ipq806x_generic/backports-5.8.18-1/.built] Error 2
make[3]: Leaving directory '/home/sumo/builds/openwrt/package/kernel/mac80211'
time: package/kernel/mac80211/compile#2.31#1.39#3.77
    ERROR: package/kernel/mac80211 failed to build.
make[2]: *** [package/Makefile:114: package/kernel/mac80211/compile] Error 1
make[2]: Leaving directory '/home/sumo/builds/openwrt'
make[1]: *** [package/Makefile:108: /home/sumo/builds/openwrt/staging_dir/target-arm_cortex-a15+neon-vfpv4_musl_eabi/stamp/.package_compile] Error 2
make[1]: Leaving directory '/home/sumo/builds/openwrt'
make: *** [/home/sumo/builds/openwrt/include/toplevel.mk:230: world] Error 2

Do you happen to know what may have gone wrong? Do I have to do anything special to do an NSS build? Thanks!

Make clean or make dirclean and see if that clears out your error.

Let me know if you have further issues / if it provides a specific reason why it failed at a higher verbosity level.