<freeStyleBuild _class='hudson.model.FreeStyleBuild'><action _class='hudson.model.CauseAction'><cause _class='org.jenkinsci.plugins.parameterizedscheduler.ParameterizedTimerTriggerCause'><shortDescription>Started by timer with parameters: {BUILD_CFG_TARGET_DEV=WG1400HP/WG1800HP/WG1800HP2 (QCA9558)}</shortDescription></cause></action><action _class='hudson.model.ParametersAction'><parameter _class='hudson.model.BooleanParameterValue'><name>BUILD_CFG_DISTCLEAN</name><value>true</value></parameter><parameter _class='hudson.model.BooleanParameterValue'><name>BUILD_CFG_DIFFCONFIG</name><value>true</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>BUILD_CFG_TARGET_DEV</name><value>WG1400HP/WG1800HP/WG1800HP2 (QCA9558)</value></parameter></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmain _class='hudson.plugins.git.util.Build'><buildNumber>497</buildNumber><marked><SHA1>98f3808362bec6dc5eee0479be7f4239efbfa91e</SHA1><branch><SHA1>98f3808362bec6dc5eee0479be7f4239efbfa91e</SHA1><name>refs/remotes/origin/main</name></branch></marked><revision><SHA1>98f3808362bec6dc5eee0479be7f4239efbfa91e</SHA1><branch><SHA1>98f3808362bec6dc5eee0479be7f4239efbfa91e</SHA1><name>refs/remotes/origin/main</name></branch></revision></refsremotesoriginmain></buildsByBranchName><lastBuiltRevision><SHA1>98f3808362bec6dc5eee0479be7f4239efbfa91e</SHA1><branch><SHA1>98f3808362bec6dc5eee0479be7f4239efbfa91e</SHA1><name>refs/remotes/origin/main</name></branch></lastBuiltRevision><remoteUrl>https://github.com/openwrt/openwrt</remoteUrl><scmName></scmName></action><action></action><action></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'><artifactsUrl>https://taiha.net/jenkins/job/OpenWrt-master-NEC-BSD-Aterm/497/artifact</artifactsUrl><changesUrl>https://taiha.net/jenkins/job/OpenWrt-master-NEC-BSD-Aterm/changes</changesUrl><displayUrl>https://taiha.net/jenkins/job/OpenWrt-master-NEC-BSD-Aterm/497/</displayUrl><testsUrl>https://taiha.net/jenkins/job/OpenWrt-master-NEC-BSD-Aterm/497/testReport</testsUrl></action><artifact><displayPath>config.buildinfo</displayPath><fileName>config.buildinfo</fileName><relativePath>bin/targets/ath79/generic/config.buildinfo</relativePath></artifact><artifact><displayPath>feeds.buildinfo</displayPath><fileName>feeds.buildinfo</fileName><relativePath>bin/targets/ath79/generic/feeds.buildinfo</relativePath></artifact><artifact><displayPath>openwrt-ath79-generic-nec_wg1400hp-initramfs-factory.bin</displayPath><fileName>openwrt-ath79-generic-nec_wg1400hp-initramfs-factory.bin</fileName><relativePath>bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1400hp-initramfs-factory.bin</relativePath></artifact><artifact><displayPath>openwrt-ath79-generic-nec_wg1400hp-initramfs-kernel.bin</displayPath><fileName>openwrt-ath79-generic-nec_wg1400hp-initramfs-kernel.bin</fileName><relativePath>bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1400hp-initramfs-kernel.bin</relativePath></artifact><artifact><displayPath>openwrt-ath79-generic-nec_wg1400hp-squashfs-sysupgrade.bin</displayPath><fileName>openwrt-ath79-generic-nec_wg1400hp-squashfs-sysupgrade.bin</fileName><relativePath>bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1400hp-squashfs-sysupgrade.bin</relativePath></artifact><artifact><displayPath>openwrt-ath79-generic-nec_wg1400hp-uboot.bin</displayPath><fileName>openwrt-ath79-generic-nec_wg1400hp-uboot.bin</fileName><relativePath>bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1400hp-uboot.bin</relativePath></artifact><artifact><displayPath>openwrt-ath79-generic-nec_wg1800hp-initramfs-factory.bin</displayPath><fileName>openwrt-ath79-generic-nec_wg1800hp-initramfs-factory.bin</fileName><relativePath>bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1800hp-initramfs-factory.bin</relativePath></artifact><artifact><displayPath>openwrt-ath79-generic-nec_wg1800hp-initramfs-kernel.bin</displayPath><fileName>openwrt-ath79-generic-nec_wg1800hp-initramfs-kernel.bin</fileName><relativePath>bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1800hp-initramfs-kernel.bin</relativePath></artifact><artifact><displayPath>openwrt-ath79-generic-nec_wg1800hp-squashfs-sysupgrade.bin</displayPath><fileName>openwrt-ath79-generic-nec_wg1800hp-squashfs-sysupgrade.bin</fileName><relativePath>bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1800hp-squashfs-sysupgrade.bin</relativePath></artifact><artifact><displayPath>openwrt-ath79-generic-nec_wg1800hp-uboot.bin</displayPath><fileName>openwrt-ath79-generic-nec_wg1800hp-uboot.bin</fileName><relativePath>bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1800hp-uboot.bin</relativePath></artifact><artifact><displayPath>openwrt-ath79-generic-nec_wg1800hp2-initramfs-factory.bin</displayPath><fileName>openwrt-ath79-generic-nec_wg1800hp2-initramfs-factory.bin</fileName><relativePath>bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1800hp2-initramfs-factory.bin</relativePath></artifact><artifact><displayPath>openwrt-ath79-generic-nec_wg1800hp2-initramfs-kernel.bin</displayPath><fileName>openwrt-ath79-generic-nec_wg1800hp2-initramfs-kernel.bin</fileName><relativePath>bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1800hp2-initramfs-kernel.bin</relativePath></artifact><artifact><displayPath>openwrt-ath79-generic-nec_wg1800hp2-squashfs-sysupgrade.bin</displayPath><fileName>openwrt-ath79-generic-nec_wg1800hp2-squashfs-sysupgrade.bin</fileName><relativePath>bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1800hp2-squashfs-sysupgrade.bin</relativePath></artifact><artifact><displayPath>openwrt-ath79-generic-nec_wg1800hp2-uboot.bin</displayPath><fileName>openwrt-ath79-generic-nec_wg1800hp2-uboot.bin</fileName><relativePath>bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1800hp2-uboot.bin</relativePath></artifact><artifact><displayPath>openwrt-ath79-generic.manifest</displayPath><fileName>openwrt-ath79-generic.manifest</fileName><relativePath>bin/targets/ath79/generic/openwrt-ath79-generic.manifest</relativePath></artifact><artifact><displayPath>profiles.json</displayPath><fileName>profiles.json</fileName><relativePath>bin/targets/ath79/generic/profiles.json</relativePath></artifact><artifact><displayPath>sha256sums</displayPath><fileName>sha256sums</fileName><relativePath>bin/targets/ath79/generic/sha256sums</relativePath></artifact><artifact><displayPath>version.buildinfo</displayPath><fileName>version.buildinfo</fileName><relativePath>bin/targets/ath79/generic/version.buildinfo</relativePath></artifact><building>false</building><description>diffconfig: true, device: WG1400HP/WG1800HP/WG1800HP2 (QCA9558)</description><displayName>#497</displayName><duration>2172135</duration><estimatedDuration>2195975</estimatedDuration><fullDisplayName>OpenWrt (master) for NEC Aterm (NetBSD based) #497</fullDisplayName><id>497</id><inProgress>false</inProgress><keepLog>false</keepLog><number>497</number><queueId>62</queueId><result>SUCCESS</result><timestamp>1790220000646</timestamp><url>https://taiha.net/jenkins/job/OpenWrt-master-NEC-BSD-Aterm/497/</url><builtOn>home-slave02_taihasv</builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/generic/backport-6.18/852-v7.1-rtc-cmos-use-platform_get_irq_optional.patch</affectedPath><commitId>5c95472821ea421a600547a508a2abe36c697447</commitId><timestamp>1789978466000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName></author><authorEmail>robimarko@gmail.com</authorEmail><comment>kernel: backport rtc-cmos use platform_get_irq_optional()

Backport upstream commit e9f850ba66cd ("rtc: cmos: Use
platform_get_irq_optional() in cmos_platform_probe()"),
which landed in v7.1.

The rtc-cmos driver can live without an IRQ and returning an error
code from platform_get_irq() is not a problem for it in general, so
make it call platform_get_irq_optional() in cmos_platform_probe()
instead of platform_get_irq() to avoid a confusing error message
printed by the latter if an IRQ cannot be found for index 0, which
is possible on x86 platforms.

Additionally, on x86, if the IRQ is not defined and the system has
a legacy PIC, hardcode it to RTC_IRQ, which should be safe then (and
which is what the dropped PNP code did).

Fixes: https://github.com/openwrt/openwrt/issues/25248

Signed-off-by: Andy Chiang &lt;AndyChiang_git@outlook.com&gt;
Link: https://github.com/openwrt/openwrt/pull/25264
Signed-off-by: Robert Marko &lt;robimarko@gmail.com&gt;
</comment><date>2026-09-21 10:14:26 +0200</date><id>5c95472821ea421a600547a508a2abe36c697447</id><msg>kernel: backport rtc-cmos use platform_get_irq_optional()</msg><path><editType>add</editType><file>target/linux/generic/backport-6.18/852-v7.1-rtc-cmos-use-platform_get_irq_optional.patch</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/generic/backport-6.18/798-v7.1-net-phy-mxl-gpy-add-PHY-level-statistics-via-ethtool.patch</affectedPath><affectedPath>target/linux/generic/backport-6.18/720-v7.2-net-phy-intel-xway-add-PHY-level-statistics-via-etht.patch</affectedPath><commitId>41f9a2065d51829faf14ccdec7ad44df0a447280</commitId><timestamp>1789978897000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName></author><authorEmail>robimarko@gmail.com</authorEmail><comment>kernel: backport Lantiq and Maxlinear PHY level statistics support

Backport Lantiq and Maxlineat PHY level statistics support. These
statistics count frames dropped by the PHY due to invalid symbols
on layer 1.

Tested on Lantiq/Maxlinear GPY111:
root@OpenWrt:~# ethtool -S lan3 --groups eth-phy
Standard stats for lan3:
eth-phy-SymbolErrorDuringCarrier: 856

Signed-off-by: Aleksander Jan Bajkowski &lt;olek2@wp.pl&gt;
Link: https://github.com/openwrt/openwrt/pull/25282
Signed-off-by: Robert Marko &lt;robimarko@gmail.com&gt;
</comment><date>2026-09-21 10:21:37 +0200</date><id>41f9a2065d51829faf14ccdec7ad44df0a447280</id><msg>kernel: backport Lantiq and Maxlinear PHY level statistics support</msg><path><editType>add</editType><file>target/linux/generic/backport-6.18/798-v7.1-net-phy-mxl-gpy-add-PHY-level-statistics-via-ethtool.patch</file></path><path><editType>add</editType><file>target/linux/generic/backport-6.18/720-v7.2-net-phy-intel-xway-add-PHY-level-statistics-via-etht.patch</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tools/xz/Makefile</affectedPath><commitId>cce54a1d82a33ede9e917d3bf90df573cf033484</commitId><timestamp>1789990093000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName></author><authorEmail>robimarko@gmail.com</authorEmail><comment>tools/xz: update to version 5.8.4

Release Notes:
https://github.com/tukaani-project/xz/releases/tag/v5.8.4

Signed-off-by: Shiji Yang &lt;yangshiji66@outlook.com&gt;
Link: https://github.com/openwrt/openwrt/pull/25295
Signed-off-by: Robert Marko &lt;robimarko@gmail.com&gt;
</comment><date>2026-09-21 13:28:13 +0200</date><id>cce54a1d82a33ede9e917d3bf90df573cf033484</id><msg>tools/xz: update to version 5.8.4</msg><path><editType>edit</editType><file>tools/xz/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/qualcommax/ipq807x/base-files/etc/board.d/02_network</affectedPath><commitId>c618c6a353f2adafab4c182224739d3687896e49</commitId><timestamp>1789990234000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName></author><authorEmail>robimarko@gmail.com</authorEmail><comment>qualcommax: ipq807x: ax89x: use lan1 for failsafe

The default failsafe script just takes the first interface from the UCI LAN
inteface list, so its currently using the SFP interface in failsafe.

Since this is not convenient at all, change the order so that lan1 will now
be used for failsafe instead.

Fixes: #23633
Signed-off-by: Robert Marko &lt;robimarko@gmail.com&gt;
</comment><date>2026-09-21 13:30:34 +0200</date><id>c618c6a353f2adafab4c182224739d3687896e49</id><msg>qualcommax: ipq807x: ax89x: use lan1 for failsafe</msg><path><editType>edit</editType><file>target/linux/qualcommax/ipq807x/base-files/etc/board.d/02_network</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/vlan.c</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/dsa.c</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl930x.c</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/common.c</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/stp.c</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl839x.c</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl838x.c</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/Makefile</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/vlan.h</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/debugfs.c</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl931x.c</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/stp.h</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl-otto.h</affectedPath><commitId>14651b96832a9f9cef3b7bdcfb3dfecf9161ac58</commitId><timestamp>1790005920000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: dsa: move STP and MST handling into a separate source file

STP and MST handling is spread across dsa.c, common.c and the
chip-specific source files. Group it in stp.c to keep port state
handling, MST slot management and hardware access together.

Move the associated function comments and register definitions with
the implementation. Add stp.h for the shared declarations and MST slot
structure, and update the callers and Makefile.

Replace the spanning-tree control register field with a per-chip
initialization callback so the register definitions remain private to
stp.c. Add a helper for updating non-CIST port states during bridge
join and leave.

Preserve the existing locking and forwarding behavior, and remove
excess blank lines left by the moved code.

Assisted-by: ChatGPT (OpenAI GPT-6 Astra)
Link: https://github.com/openwrt/openwrt/pull/25292
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-09-21 17:52:00 +0200</date><id>14651b96832a9f9cef3b7bdcfb3dfecf9161ac58</id><msg>realtek: dsa: move STP and MST handling into a separate source file</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/vlan.c</file></path><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl839x.c</file></path><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/vlan.h</file></path><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl931x.c</file></path><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl838x.c</file></path><path><editType>add</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/stp.c</file></path><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/debugfs.c</file></path><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/Makefile</file></path><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/common.c</file></path><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/dsa.c</file></path><path><editType>add</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/stp.h</file></path><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl-otto.h</file></path><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl930x.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/qualcommbe/image/ipq95xx.mk</affectedPath><commitId>f6442c8840b891214b9814f499d41c383d250932</commitId><timestamp>1790064218000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName></author><authorEmail>robimarko@gmail.com</authorEmail><comment>qualcommbe: ipq95xx: drop KERNEL_LOADADDR for askey_sbe1v1k

askey_sbe1v1k currently sets KERNEL_LOADADDR to 0x42080000, which is not
2MB-aligned. This trips the arm64 boot code's alignment check and
prints the following warning on every boot:

  [Firmware Bug]: Kernel image misaligned at boot, please fix your
  bootloader!

0x42080000 is a 2MB-aligned base plus the legacy TEXT_OFFSET of
0x80000, which arm64 kernels used before v5.8. Since v5.8, TEXT_OFFSET
is fixed at 0, so the kernel now expects the load address itself to sit
on a 2MB boundary. This target runs on much newer kernels, so the old
offset is stale and only serves to trigger the FW_BUG warning.

Instead of manually shifting the address, drop the device-specific
KERNEL_LOADADDR override entirely. This allows the image to fall back
to the target's default load address (0x41000000), which is properly
2MB-aligned and cleanly resolves the alignment warning.

Verified by both TFTP-booting the .itb and flashing the generated
sysupgrade image to a physical bare-metal device. The device boots
cleanly, operates stably, and the misalignment warning no longer appears.

Signed-off-by: Jackie Han &lt;jackie.han@gmail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/25283
Signed-off-by: Robert Marko &lt;robimarko@gmail.com&gt;
</comment><date>2026-09-22 10:03:38 +0200</date><id>f6442c8840b891214b9814f499d41c383d250932</id><msg>qualcommbe: ipq95xx: drop KERNEL_LOADADDR for askey_sbe1v1k</msg><path><editType>edit</editType><file>target/linux/qualcommbe/image/ipq95xx.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/qualcommax/dts/ipq6018-mr7500.dts</affectedPath><commitId>773a9c473f735289f9f8b608c5ade2a7e0778541</commitId><timestamp>1790067110000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName></author><authorEmail>robimarko@gmail.com</authorEmail><comment>qualcommax: fix partition map and GPIO polarity for MR7500

Updates the MR7500 DTS to correctly map the partition containing the WAN
PHY firmware.
Also fixes inverted PHY reset polarity.

Signed-off-by: Ross Barnes-Brown &lt;true.robot.ross@gmail.com&gt;
Signed-off-by: Paweł Owoc &lt;frut3k7@gmail.com&gt;
Co-authored-by: Paweł Owoc &lt;frut3k7@gmail.com&gt;
</comment><date>2026-09-22 10:51:50 +0200</date><id>773a9c473f735289f9f8b608c5ade2a7e0778541</id><msg>qualcommax: fix partition map and GPIO polarity for MR7500</msg><path><editType>edit</editType><file>target/linux/qualcommax/dts/ipq6018-mr7500.dts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/generic/pending-6.18/739-05-net-pcs-add-driver-for-MediaTek-USXGMII-PCS.patch</affectedPath><commitId>328acd4e9d3407758c55917484823bc1726df64a</commitId><timestamp>1790076459000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName></author><authorEmail>robimarko@gmail.com</authorEmail><comment>generic: remove Kconfig.orig from USXGMII PCS patch

The imported PCS patch accidentlly adds drivers/net/pcs/Kconfig.orig.
Remove this file from the patch.

Fixes: 18cbd83a1443 ("generic: 6.18: import updated standalone PCS handling")
Signed-off-by: Zhengping Zhang &lt;zhengping.zhang@airoha.com&gt;
Link: https://github.com/openwrt/openwrt/pull/25319
Signed-off-by: Robert Marko &lt;robimarko@gmail.com&gt;
</comment><date>2026-09-22 13:27:39 +0200</date><id>328acd4e9d3407758c55917484823bc1726df64a</id><msg>generic: remove Kconfig.orig from USXGMII PCS patch</msg><path><editType>edit</editType><file>target/linux/generic/pending-6.18/739-05-net-pcs-add-driver-for-MediaTek-USXGMII-PCS.patch</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/microchipsw/patches-6.18/0015-spi-atmel-quadspi-use-init-callback-for-gclk-variant.patch</affectedPath><affectedPath>target/linux/microchipsw/patches-6.18/0016-spi-atmel-quadspi-add-LAN969x-QSPI-support.patch</affectedPath><affectedPath>target/linux/microchipsw/patches-6.18/0014-v7.3-spi-atmel-quadspi-add-controller-init-callback.patch</affectedPath><affectedPath>target/linux/microchipsw/patches-6.18/0017-arm64-dts-microchip-lan969x-add-QSPI-nodes.patch</affectedPath><affectedPath>target/linux/microchipsw/patches-6.18/0017-v7.3-arm64-dts-microchip-lan969x-add-QSPI-nodes.patch</affectedPath><affectedPath>target/linux/microchipsw/patches-6.18/0016-v7.3-spi-atmel-quadspi-add-LAN969x-QSPI-support.patch</affectedPath><affectedPath>target/linux/microchipsw/patches-6.18/0015-v7.3-spi-atmel-quadspi-use-init-callback-for-gclk-variant.patch</affectedPath><affectedPath>target/linux/microchipsw/patches-6.18/0014-spi-atmel-quadspi-add-controller-init-callback.patch</affectedPath><commitId>809afa7e4312230beccb6829ed255f9b2f324290</commitId><timestamp>1790081597000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robert.marko</absoluteUrl><fullName>robert.marko</fullName></author><authorEmail>robert.marko@sartura.hr</authorEmail><comment>microchipsw: add version to QSPI backport

QSPI support was merged into 7.3, so mark the patches as such.

Signed-off-by: Robert Marko &lt;robert.marko@sartura.hr&gt;
</comment><date>2026-09-22 14:53:17 +0200</date><id>809afa7e4312230beccb6829ed255f9b2f324290</id><msg>microchipsw: add version to QSPI backport</msg><path><editType>delete</editType><file>target/linux/microchipsw/patches-6.18/0014-spi-atmel-quadspi-add-controller-init-callback.patch</file></path><path><editType>add</editType><file>target/linux/microchipsw/patches-6.18/0015-v7.3-spi-atmel-quadspi-use-init-callback-for-gclk-variant.patch</file></path><path><editType>delete</editType><file>target/linux/microchipsw/patches-6.18/0017-arm64-dts-microchip-lan969x-add-QSPI-nodes.patch</file></path><path><editType>add</editType><file>target/linux/microchipsw/patches-6.18/0016-v7.3-spi-atmel-quadspi-add-LAN969x-QSPI-support.patch</file></path><path><editType>add</editType><file>target/linux/microchipsw/patches-6.18/0014-v7.3-spi-atmel-quadspi-add-controller-init-callback.patch</file></path><path><editType>delete</editType><file>target/linux/microchipsw/patches-6.18/0015-spi-atmel-quadspi-use-init-callback-for-gclk-variant.patch</file></path><path><editType>delete</editType><file>target/linux/microchipsw/patches-6.18/0016-spi-atmel-quadspi-add-LAN969x-QSPI-support.patch</file></path><path><editType>add</editType><file>target/linux/microchipsw/patches-6.18/0017-v7.3-arm64-dts-microchip-lan969x-add-QSPI-nodes.patch</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/microchipsw/patches-6.18/102-arm64-dts-microchip-ev23x71a-enable-QSPI.patch</affectedPath><affectedPath>target/linux/microchipsw/patches-6.18/100-mmc-sdhci-of-at91-disable-selectively-clocks-on-pm-r.patch</affectedPath><affectedPath>target/linux/microchipsw/patches-6.18/100-dt-bindings-mmc-atmel-sama5d2-sdhci-add-LAN969x-comp.patch</affectedPath><affectedPath>target/linux/microchipsw/patches-6.18/101-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch</affectedPath><affectedPath>target/linux/microchipsw/patches-6.18/104-arm64-dts-microchip-ev23x71a-enable-QSPI.patch</affectedPath><affectedPath>target/linux/microchipsw/patches-6.18/101-dt-bindings-mmc-atmel-sama5d2-sdhci-add-LAN969x-comp.patch</affectedPath><affectedPath>target/linux/microchipsw/patches-6.18/105-arm64-dts-microchip-ev23x71a-enable-eMMC.patch</affectedPath><affectedPath>target/linux/microchipsw/patches-6.18/102-mmc-sdhci-of-at91-add-LAN969x-support.patch</affectedPath><affectedPath>target/linux/microchipsw/patches-6.18/103-arm64-dts-microchip-ev23x71a-enable-eMMC.patch</affectedPath><affectedPath>target/linux/microchipsw/patches-6.18/103-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch</affectedPath><commitId>6727587d2439cca176aa948392ba34f04515f3d4</commitId><timestamp>1790081597000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robert.marko</absoluteUrl><fullName>robert.marko</fullName></author><authorEmail>robert.marko@sartura.hr</authorEmail><comment>microchipsw: use latest MMC patches

Use the latest version of MMC patches pending upstream.

Signed-off-by: Robert Marko &lt;robert.marko@sartura.hr&gt;
</comment><date>2026-09-22 14:53:17 +0200</date><id>6727587d2439cca176aa948392ba34f04515f3d4</id><msg>microchipsw: use latest MMC patches</msg><path><editType>add</editType><file>target/linux/microchipsw/patches-6.18/103-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch</file></path><path><editType>delete</editType><file>target/linux/microchipsw/patches-6.18/102-arm64-dts-microchip-ev23x71a-enable-QSPI.patch</file></path><path><editType>add</editType><file>target/linux/microchipsw/patches-6.18/105-arm64-dts-microchip-ev23x71a-enable-eMMC.patch</file></path><path><editType>delete</editType><file>target/linux/microchipsw/patches-6.18/101-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch</file></path><path><editType>add</editType><file>target/linux/microchipsw/patches-6.18/104-arm64-dts-microchip-ev23x71a-enable-QSPI.patch</file></path><path><editType>add</editType><file>target/linux/microchipsw/patches-6.18/102-mmc-sdhci-of-at91-add-LAN969x-support.patch</file></path><path><editType>add</editType><file>target/linux/microchipsw/patches-6.18/100-mmc-sdhci-of-at91-disable-selectively-clocks-on-pm-r.patch</file></path><path><editType>delete</editType><file>target/linux/microchipsw/patches-6.18/103-arm64-dts-microchip-ev23x71a-enable-eMMC.patch</file></path><path><editType>add</editType><file>target/linux/microchipsw/patches-6.18/101-dt-bindings-mmc-atmel-sama5d2-sdhci-add-LAN969x-comp.patch</file></path><path><editType>delete</editType><file>target/linux/microchipsw/patches-6.18/100-dt-bindings-mmc-atmel-sama5d2-sdhci-add-LAN969x-comp.patch</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/dts/rtl9303_horaco_zx-swtgw2c8f.dts</affectedPath><commitId>b0a05388ed6e74c70241525192b5045f7a09e7e1</commitId><timestamp>1790088470000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: fix Horaco ZX-SWTGW2C8F port status LEDs for 2.5G

Corrected 2.5G port status LED operation

Signed-off-by: DSP ALU32 &lt;dspalu32@gmail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/25291
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-09-22 16:47:50 +0200</date><id>b0a05388ed6e74c70241525192b5045f7a09e7e1</id><msg>realtek: fix Horaco ZX-SWTGW2C8F port status LEDs for 2.5G</msg><path><editType>edit</editType><file>target/linux/realtek/dts/rtl9303_horaco_zx-swtgw2c8f.dts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/dts/rtl9303_horaco_zx-swtgw2c8f.dts</affectedPath><commitId>45dc02ca085d552a3b95e763f8894e6e694bd0c3</commitId><timestamp>1790088470000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: fix Horaco ZX-SWTGW2C8F sysupgrade: MTD partition rename

Corrected name of 'firmware' MTD partition to fix sysupgrade (was 'runtime')

Signed-off-by: DSP ALU32 &lt;dspalu32@gmail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/25291
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-09-22 16:47:50 +0200</date><id>45dc02ca085d552a3b95e763f8894e6e694bd0c3</id><msg>realtek: fix Horaco ZX-SWTGW2C8F sysupgrade: MTD partition rename</msg><path><editType>edit</editType><file>target/linux/realtek/dts/rtl9303_horaco_zx-swtgw2c8f.dts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/dts/rtl9303_horaco_zx-swtgw2c8f.dts</affectedPath><commitId>54937fe9d6420e390c23635bff0dea1c7a6a4da6</commitId><timestamp>1790088470000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: add SFP thermal zone/sensors for Horaco ZX-SWTGW2C8F

Added SFP thermal zone, in line with other RTL9303 devices on OpenWrt

Signed-off-by: DSP ALU32 &lt;dspalu32@gmail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/25291
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-09-22 16:47:50 +0200</date><id>54937fe9d6420e390c23635bff0dea1c7a6a4da6</id><msg>realtek: add SFP thermal zone/sensors for Horaco ZX-SWTGW2C8F</msg><path><editType>edit</editType><file>target/linux/realtek/dts/rtl9303_horaco_zx-swtgw2c8f.dts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c</affectedPath><commitId>f4cf59fe1c11823d211854d70eeb351e8345d5d5</commitId><timestamp>1790088554000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: l3: do not queue FIB work for multicast routes

The FIB notifier lets the two multicast families through its filter, but
the branch that fills the work item runs only for AF_INET. An entry
event from ipmr or ip6mr therefore queues a work item whose fib_info
pointer is still the zero kzalloc() left there, and the add handler the
worker calls hands that NULL to fib_info_nh(), whose first act is to
read fi-&gt;nh. The box oopses there and panics.

The events are real ones: mr_call_mfc_notifiers() sends ENTRY_ADD,
ENTRY_REPLACE and ENTRY_DEL down the same chain this driver registers
on, once per multicast cache entry a routing daemon installs or removes.

What it takes is a kernel built with multicast routing, a daemon that
installs a cache entry, and a switch whose L3 setup is in place. The mfc
add and delete paths and mroute_clean_tables() emit these notifiers, in
ipmr and ip6mr alike, and mr_dump() replays every existing entry to a
notifier that has just registered - so the driver can also meet one at
its own probe, if a daemon installed it first. All of them start from
userspace. CONFIG_IP_MROUTE and CONFIG_IPV6_MROUTE are off in the generic
config and no realtek subtarget turns them on, so a stock image never
gets there either.

Given both, no command and no route added by hand are needed: an
RTL9303 with the offload compiled in and smcroute installed dies 58
seconds into its first boot, as the daemon opens its interfaces during
the ordinary network bring-up.

Measured the other way round as well: an image built the same way and
differing by this commit and one unrelated L3 fix runs on, 273 seconds
against a 58 second failure window, with nothing in the log. The RTL839x
carries its L3 setup outside any config symbol, so a build of that
family with multicast routing on is enough as well; the RTL930x
additionally needs the offload symbol, which no subtarget config sets.

Take only the two families the driver decodes.

Assisted-by: Claude:claude-opus-5
Signed-off-by: Gennaro Cimmino &lt;gcimmino@rayonra.net&gt;
Link: https://github.com/openwrt/openwrt/pull/25309
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-09-22 16:49:14 +0200</date><id>f4cf59fe1c11823d211854d70eeb351e8345d5d5</id><msg>realtek: l3: do not queue FIB work for multicast routes</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl931x.c</affectedPath><affectedPath>target/linux/realtek/files-6.18/include/linux/soc/realtek/otto_table.h</affectedPath><commitId>6b46fe37b517946906b93b9428ae0fc592f4f195</commitId><timestamp>1790091563000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: soc: define a macro for table reads with non zero word offset

The RTL931X utilizes the otto_table_read_bytes function in its DSA driver
as it needs field and mib offsets for stat reading.

This can be replaced by a proper otto_table_offset_read macro which takes
4th variable as a word offset for otto_table_read_bytes.

Signed-off-by: Rustam Adilov &lt;adilov@tutamail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/25136
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-09-22 17:39:23 +0200</date><id>6b46fe37b517946906b93b9428ae0fc592f4f195</id><msg>realtek: soc: define a macro for table reads with non zero word offset</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl931x.c</file></path><path><editType>edit</editType><file>target/linux/realtek/files-6.18/include/linux/soc/realtek/otto_table.h</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c</affectedPath><commitId>3ac6d739fa3a284c0b0377b47b0b005beb62abc0</commitId><timestamp>1790091564000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: soc: split addr to ctrl/sts and data to read/write

In preparation for upcoming support of RTL9607C split the addr and
data properties of otto_table struct into control address, status
address and write and read data windows.

Signed-off-by: Rustam Adilov &lt;adilov@tutamail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/25136
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-09-22 17:39:24 +0200</date><id>3ac6d739fa3a284c0b0377b47b0b005beb62abc0</id><msg>realtek: soc: split addr to ctrl/sts and data to read/write</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c</affectedPath><commitId>188f5ef394c7e78bf98c914326d83c93c938c7d9</commitId><timestamp>1790091564000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: soc: add busy status bit property

The TBL_ACCESS_CTRL register of RTL9607C does not have an execute
bit and thus relies on a separate busy bit in its TBL_ACCESS_STS
register. Add a busy bit with -1 describing the lack of that bit
in the table registers.

Signed-off-by: Rustam Adilov &lt;adilov@tutamail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/25136
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-09-22 17:39:24 +0200</date><id>188f5ef394c7e78bf98c914326d83c93c938c7d9</id><msg>realtek: soc: add busy status bit property</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c</affectedPath><commitId>bdc34d92af2b0589406325a6f6572486f5e54d99</commitId><timestamp>1790091564000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: soc: add addr lsb and addr msb properties to table struct

The address bit field of TBL_ACCESS_CTRL register on RTL9607C is not located
at 0 lsb. Introduce new addr lsb and addr msb properties to otto_table struct.
This also accidentally fixes the address mask of OTTO_REG_9300_L2 table as the
"BIT(t_bit) - 1" would result in an extra 2 bits.

Signed-off-by: Rustam Adilov &lt;adilov@tutamail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/25136
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-09-22 17:39:24 +0200</date><id>bdc34d92af2b0589406325a6f6572486f5e54d99</id><msg>realtek: soc: add addr lsb and addr msb properties to table struct</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c</affectedPath><commitId>a74fa4bf4dd60243fe4e81c76b57c3813ae168e7</commitId><timestamp>1790091564000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: soc: add read/write execute bits

The RTL9607C NAT_TBL_ACCESS_CTRL register has 2 split execute bits for read and
write operations and thus does not have command bit. Add the read/write execute
bit to otto_table struct and change c_bit to signed where -1 is unused to make
NAT_TBL_ACCESS_CTRL work.

Signed-off-by: Rustam Adilov &lt;adilov@tutamail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/25136
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-09-22 17:39:24 +0200</date><id>a74fa4bf4dd60243fe4e81c76b57c3813ae168e7</id><msg>realtek: soc: add read/write execute bits</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c</affectedPath><commitId>070ed83c88f209a7b3e27c2ee2a7e7eaaace3ac8</commitId><timestamp>1790091564000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: soc: add m_bit and hit_bit properties

The RTL9607C has access method bit field that is used as a look-up
method for read queries of L2 tables and hit bit for whether or not
the table query found an entry. It is exactly the same as how L2
tables are interfaced on RTL8365MB switch as per rtl8365mb_table in
its DSA driver.

For now only the otto_table sruct is changed for description purposes
without adding the functionality.

Signed-off-by: Rustam Adilov &lt;adilov@tutamail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/25136
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-09-22 17:39:24 +0200</date><id>070ed83c88f209a7b3e27c2ee2a7e7eaaace3ac8</id><msg>realtek: soc: add m_bit and hit_bit properties</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c</affectedPath><affectedPath>target/linux/realtek/files-6.18/include/linux/soc/realtek/otto_table.h</affectedPath><commitId>1a881f81d088b4fbabcd4db4bd79cdb6cdf12ad9</commitId><timestamp>1790091564000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: soc: add offset parameter to otto_table_map

Add the offset parameter to otto_table_map struct since some RTL9607C tables
like ACL_DATA and CF_RULE_T* require addition of an offset to their index to
differentiate from their MASK table counterpart.

Signed-off-by: Rustam Adilov &lt;adilov@tutamail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/25136
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-09-22 17:39:24 +0200</date><id>1a881f81d088b4fbabcd4db4bd79cdb6cdf12ad9</id><msg>realtek: soc: add offset parameter to otto_table_map</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/include/linux/soc/realtek/otto_table.h</file></path><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c</affectedPath><affectedPath>target/linux/realtek/files-6.18/include/linux/soc/realtek/otto_table.h</affectedPath><commitId>07a2f397383799cc0acc73bec3a61eceff83262e</commitId><timestamp>1790091564000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: soc: add support for RTL9607C Tables

The RTL9607C SoC is another Otto family member with very identical indirect
table access as the rest of existing switch SoCs. It has two registers that
control tables: TBL_ACCESS_CTRL for LUT, VLAN, ACL and Classification tables
and NAT_TBL_ACCESS_CTRL for HWNAT related tables.

Add these two main control registers to OTTO_REG_LIST and all of their tables
to otto_table_maps and otto_table_id in header file.

Signed-off-by: Rustam Adilov &lt;adilov@tutamail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/25136
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-09-22 17:39:24 +0200</date><id>07a2f397383799cc0acc73bec3a61eceff83262e</id><msg>realtek: soc: add support for RTL9607C Tables</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/include/linux/soc/realtek/otto_table.h</file></path><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>scripts/download.pl</affectedPath><commitId>ffef939ec42a94d5f31018f876515c00b1ae5dc9</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>scripts/download.pl: delete local file with hash mismatch

The unlink of a local file with a hash mismatch comes after the die,
so it never runs. The message says that the file is deleted, but it
stays, and every following build fails in the same way.

Delete the file before the die, so that the next run downloads it
again.

Fixes: 4e19cbc553 ("download: handle possibly invalid local tarballs")
Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>ffef939ec42a94d5f31018f876515c00b1ae5dc9</id><msg>scripts/download.pl: delete local file with hash mismatch</msg><path><editType>edit</editType><file>scripts/download.pl</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/boot/uboot-mediatek/Makefile</affectedPath><commitId>468176411cb819cf6c5b09d3383e91cded6622ce</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>uboot-mediatek: rebuild the fip if BL31 changed

The fip contains BL31 from trusted-firmware-a, but the U-Boot build does
not depend on it. After a rebuild of trusted-firmware-a, the fip and the
images that contain it keep the old BL31.

Make the build stamp depend on the BL31 image.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>468176411cb819cf6c5b09d3383e91cded6622ce</id><msg>uboot-mediatek: rebuild the fip if BL31 changed</msg><path><editType>edit</editType><file>package/boot/uboot-mediatek/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/package.mk</affectedPath><commitId>a0e191667cac3447017c29fd76cad6843b045b58</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: exclude apk staging dirs from the autorebuild check

The rdep check on PKG_BUILD_DIR excludes the ipkg-* staging dirs, but
not the apk-* ones. The package step writes the apk scripts after
.built is touched. If this crosses a second boundary, the next build
sees newer files and packs the package again, which starts the loop
again. The kernel package with its kmods takes several seconds to pack
and is repacked on every build.

Anchor the pattern to PKG_BUILD_DIR, as a plain "*/apk-*" also matches
the build dir of the apk package itself.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>a0e191667cac3447017c29fd76cad6843b045b58</id><msg>build: exclude apk staging dirs from the autorebuild check</msg><path><editType>edit</editType><file>include/package.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>scripts/package-metadata.pl</affectedPath><commitId>f8471d798ec7694a477b7605bbeb5dcb7e9b5256</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>scripts/package-metadata.pl: keep the depends of real packages

pkgaux writes Package/&lt;name&gt;/depends for every name that a package
provides. If a package provides the name of another real package, it
overwrites the dependencies of that package: dnsmasq-full provides
dnsmasq, so dnsmasq gets the dependencies of dnsmasq-full, among them
nftables-json and libnftnl.

These lists are used for the library dependencies of the prepare
stamp. dnsmasq thus depends on libnftnl without being ordered after it,
and is built again in the build that follows a clean build.

Skip provided names that belong to another real package.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>f8471d798ec7694a477b7605bbeb5dcb7e9b5256</id><msg>scripts/package-metadata.pl: keep the depends of real packages</msg><path><editType>edit</editType><file>scripts/package-metadata.pl</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/package.mk</affectedPath><commitId>be3937dfbc341085a423d9518cfaf63c4d347235</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: only track library dependencies of selected packages

The prepare stamp of a Makefile depends on the library version files
of every package it defines, selected or not. Packages that are not
selected are not in the dependency graph of the top-level build, so
their libraries can be built after the package in a parallel build,
and the package is prepared and built again on the next run.

The own packages of a Makefile are only filtered out if they are
defined before the packages that depend on them. mac80211 defines
cfg80211 and mac80211 after the drivers, so it depends on its own
version files, and every clean build is followed by a rebuild of
mac80211, mt76 and linux-firmware.

Only add the library dependencies of selected packages, or of all
packages if DEVELOPER is set.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>be3937dfbc341085a423d9518cfaf63c4d347235</id><msg>build: only track library dependencies of selected packages</msg><path><editType>edit</editType><file>include/package.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>scripts/package-metadata.pl</affectedPath><commitId>4547335cc7d17bc6c0ab168e0d570fb479ae0ea1</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>scripts/package-metadata.pl: keep the condition of package depends

gen_package_auxiliary drops the condition of a dependency such as
+BUILD_NLS:libintl-full, so the ABI version check of a package also
counts packages that it does not depend on in this configuration.

With all packages selected and BUILD_NLS not set, libelf depends on
libintl-full. gettext-full is built after elfutils, and its new
libintl-full.version causes elfutils, and binutils, gdb, strace,
iproute2 and others through it, to be built again on the next make
call.

Write the condition as a make expression with get_conditional_dep, as
gen_package_mk does.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>4547335cc7d17bc6c0ab168e0d570fb479ae0ea1</id><msg>scripts/package-metadata.pl: keep the condition of package depends</msg><path><editType>edit</editType><file>scripts/package-metadata.pl</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>scripts/package-metadata.pl</affectedPath><commitId>d0379f4a5a3c4e9b535727711b76f8457dbc9c48</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>scripts/package-metadata.pl: list every build variant only once

If several packages of a source use the same build variant, the
variant is added to the list of variants once for each selected
package, and the variant is built as often, one after the other. With
all packages selected, hostapd builds 4 variants twice, and f2fs-tools
its 2 variants four times each.

Add each variant once, with the condition of all packages that use it.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>d0379f4a5a3c4e9b535727711b76f8457dbc9c48</id><msg>scripts/package-metadata.pl: list every build variant only once</msg><path><editType>edit</editType><file>scripts/package-metadata.pl</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/subdir.mk</affectedPath><commitId>39ed48c8f12eec91d5bf39d37ca666b6a937cc87</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: clean all stamps of a subdir

stampfile assigns the clean rule of its stamp to &lt;subdir&gt;//clean with
:=, so every call replaces the one before. toolchain and tools define
a compile and a check stamp, and &lt;subdir&gt;/clean only removes the check
stamp. After "make toolchain/clean", the compile stamp is newer than the
toolchain sources, the next build takes the toolchain as built, and the
target build fails because the compiler is missing.

Append the clean rule instead, so that all stamps are removed.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>39ed48c8f12eec91d5bf39d37ca666b6a937cc87</id><msg>build: clean all stamps of a subdir</msg><path><editType>edit</editType><file>include/subdir.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/subdir.mk</affectedPath><commitId>1315d219498e25e9cfe3c9666855b71fa4013cdb</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: log failed host builds in the error file of the subdir

Commit 501123eb7a ("include/subdir: on build failure always print
error") passes $(2) instead of $(1) to ERROR for the builds of a build
type, such as host builds. subdir has no second parameter, so with
BUILD_LOG set a failed host build is written to logs/error.txt instead
of logs/package/error.txt, where the other errors of the subdir go.

Fixes: 501123eb7a ("include/subdir: on build failure always print error")
Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>1315d219498e25e9cfe3c9666855b71fa4013cdb</id><msg>build: log failed host builds in the error file of the subdir</msg><path><editType>edit</editType><file>include/subdir.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>rules.mk</affectedPath><commitId>83b7310eb3897afa20d8bbddd59638b2614b3f73</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: do not share a file for the 64-bit time_t test

YEAR_2038 writes its test program to $(TMP_DIR)/year2038.c and deletes
it after the test. Packages that are built in parallel run the test at
the same time and use the same file, so one of them can compile a
partly written file or find no file. The test then fails, and the host
build is configured with --disable-year2038.

Pass the test program to the compiler on stdin instead.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>83b7310eb3897afa20d8bbddd59638b2614b3f73</id><msg>build: do not share a file for the 64-bit time_t test</msg><path><editType>edit</editType><file>rules.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/depends.mk</affectedPath><commitId>5433adbc6e53ea21b235d391240b716603986b5e</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: sort the file list for the stamp hash in the C locale

find_md5 sorts the list of package files with the locale of the user.
The top-level Makefile sets LC_ALL=C, but a make call in a package
directory, such as make -C package/kernel/linux, uses the locale of
the shell. With en_GB.UTF-8, some file names sort in a different
order, so the hash and the name of the prepared stamp differ, and the
package is built again. The next top-level build then builds it again.

Always sort in the C locale.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>5433adbc6e53ea21b235d391240b716603986b5e</id><msg>build: sort the file list for the stamp hash in the C locale</msg><path><editType>edit</editType><file>include/depends.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/network/utils/xdp-tools/Makefile</affectedPath><affectedPath>package/network/utils/xdp-tools/patches/0004-configure-do-not-use-bash-redirection.patch</affectedPath><commitId>111e92cce05f7e32996b7f0dd56d42e2d86e61ee</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>xdp-tools: find the arch headers of the toolchain for the BPF programs

The configure script of xdp-tools sets ARCH_INCLUDES only from the
multiarch directory of a native compiler. For a cross compiler it stays
empty, and clang takes &lt;linux/types.h&gt; for the BPF programs from
/usr/include of the host. On hosts that have &lt;asm/types.h&gt; only in the
multiarch directory, such as Debian without gcc-multilib, the build
fails:

  /usr/include/linux/types.h:5:10: fatal error: 'asm/types.h' file not found

Add the include directories of the toolchain with -idirafter. They are
searched after the headers of xdp-tools and of the system, as the
multiarch directory of a native build, so they do not replace the Linux
headers that xdp-tools ships. The target compiler already has them as
system directories.

The configure script also tests for bpftool with the bash redirection &amp;&gt;.
/bin/sh may be dash, which runs the command in the background instead, so
configure drops a working bpftool and takes the output of whereis. Add a
second patch that uses &gt;/dev/null 2&gt;&amp;1, which every shell supports.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>111e92cce05f7e32996b7f0dd56d42e2d86e61ee</id><msg>xdp-tools: find the arch headers of the toolchain for the BPF programs</msg><path><editType>add</editType><file>package/network/utils/xdp-tools/patches/0004-configure-do-not-use-bash-redirection.patch</file></path><path><editType>edit</editType><file>package/network/utils/xdp-tools/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/boot/uboot-tools/uboot-envtools/files/uboot-envtools.sh</affectedPath><commitId>bda729e82f200b3c338ac313c70e616285e4872e</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>uboot-envtools: remove stray output from the boot log

/etc/uci-defaults/30_uboot-envtools runs in preinit, before the board
file is generated. Two of its helpers write to the console:

* uci batch prints the name of every anonymous section that "add"
  creates, and nothing redirects stdout.
* grep -q hides a match, but it still reports a file that does not
  exist. /etc/fw_env.config is absent until the first append creates it.

On the first boot after a flash this puts three lines on the console:

    cfg016cb7
    cfg026cb7
    grep: /etc/fw_env.config: No such file or directory

Redirect the batch output and add -s to the grep.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>bda729e82f200b3c338ac313c70e616285e4872e</id><msg>uboot-envtools: remove stray output from the boot log</msg><path><editType>edit</editType><file>package/boot/uboot-tools/uboot-envtools/files/uboot-envtools.sh</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/kernel/lantiq/ltq-ifxos/Makefile</affectedPath><affectedPath>package/kernel/lantiq/ltq-adsl-mei/Makefile</affectedPath><affectedPath>package/kernel/lantiq/ltq-deu/Makefile</affectedPath><commitId>fbd3048f21857c53416a42181a6e9ababba4a716</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>lantiq: pass the kernel make flags to three module packages

ltq-adsl-mei and ltq-deu call make directly after a cd into the kernel
directory, and ltq-ifxos builds its module through autotools. None of them
pass KERNEL_MAKE_FLAGS, so the module compile runs without the
-ffile-prefix-map that iremap adds. WARN_ON_ONCE() in check_copy_size()
expands to warn_slowpath_fmt(__FILE__, ...), so the absolute build path
lands in the .ko.

Measured on the published snapshot packages of lantiq/xway and
xrx200_legacy:
- drv_mei_cpe.ko holds
  /builder/shared-workdir/build/build_dir/target-mips_24kc_musl/linux-lantiq_xway/linux-6.18.52/include/linux/ucopysize.h
- drv_ifxos.ko holds the same path for linux-lantiq_xrx200_legacy
- ltq_atm_danube.ko, built with the flags, holds no such string

The module size follows the length of the build path, so the apk record
and every image that carries the module differ between two builds in
different directories.

ltq_deu_vr9.ko holds no such string today, but the package has the same
defect.

Pass the flags in the same way as ltq-atm and ltq-vdsl-vr9-mei already do.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>fbd3048f21857c53416a42181a6e9ababba4a716</id><msg>lantiq: pass the kernel make flags to three module packages</msg><path><editType>edit</editType><file>package/kernel/lantiq/ltq-adsl-mei/Makefile</file></path><path><editType>edit</editType><file>package/kernel/lantiq/ltq-deu/Makefile</file></path><path><editType>edit</editType><file>package/kernel/lantiq/ltq-ifxos/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/package.mk</affectedPath><commitId>728fb15aff43e37aa3be02fb3d97277f825b504b</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: use a separate staging directory per build variant

All variants of a package collect their InstallDev files in the same
directory below $(TMP_DIR) and remove it before and after use. Add the
build variant to its name, as for the staging file list, so that the
variants of a package do not share it.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>728fb15aff43e37aa3be02fb3d97277f825b504b</id><msg>build: use a separate staging directory per build variant</msg><path><editType>edit</editType><file>include/package.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/boot/uboot-mediatek/Makefile</affectedPath><commitId>df6a1c978bda765bf684b6b7fb76ad100328ea2a</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>uboot-mediatek: compress BL31 in the build directory

With FIP_COMPRESS set, the fip step compresses the BL31 image next to
the original in the staging directory. All U-Boot variants for the same
SoC, boot device and DRAM type write the same file.

Write the compressed BL31 to the build directory of the variant instead.
The fip does not change.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>df6a1c978bda765bf684b6b7fb76ad100328ea2a</id><msg>uboot-mediatek: compress BL31 in the build directory</msg><path><editType>edit</editType><file>package/boot/uboot-mediatek/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/package-dumpinfo.mk</affectedPath><affectedPath>scripts/metadata.pm</affectedPath><affectedPath>include/subdir.mk</affectedPath><affectedPath>scripts/package-metadata.pl</affectedPath><commitId>2d40469602c0152ac17e23ca72b4f4ace32fa11a</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: allow packages to build their variants in parallel

The variants of a package are built one after the other in one recipe.
For packages with many variants, such as the boot loaders, this makes
the variants the longest chain of the package build, also if nothing
has to be done.

Add PKG_PARALLEL_VARIANTS. If a package sets it, every variant gets its
own make target with the dependencies of the package, and the package
target depends on these targets. A package must only set it if its
variants share no files outside of their build directories.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>2d40469602c0152ac17e23ca72b4f4ace32fa11a</id><msg>build: allow packages to build their variants in parallel</msg><path><editType>edit</editType><file>include/package-dumpinfo.mk</file></path><path><editType>edit</editType><file>scripts/metadata.pm</file></path><path><editType>edit</editType><file>include/subdir.mk</file></path><path><editType>edit</editType><file>scripts/package-metadata.pl</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/boot/arm-trusted-firmware-mediatek/Makefile</affectedPath><affectedPath>package/boot/uboot-mediatek/Makefile</affectedPath><commitId>b8d89de6e07934e9264d4c2c6fef834be0a52f9e</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>mediatek: build the boot loader variants in parallel

The variants of arm-trusted-firmware-mediatek and uboot-mediatek only
write to their own build directories and to files in the staging and
bin directories that have the variant in their name.

For the OpenWrt One, a clean build of the 9 TF-A variants takes 2 s
instead of 11 s, and of the 2 U-Boot variants 12 s instead of 21 s.
The images do not change.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>b8d89de6e07934e9264d4c2c6fef834be0a52f9e</id><msg>mediatek: build the boot loader variants in parallel</msg><path><editType>edit</editType><file>package/boot/uboot-mediatek/Makefile</file></path><path><editType>edit</editType><file>package/boot/arm-trusted-firmware-mediatek/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/network/services/hostapd/Makefile</affectedPath><commitId>b029d56e0bd0c4e044c6e5d918e0da96223ab8da</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>hostapd: build the variants in parallel

The variants only write to their own build directories. The packages
without a variant are only built by the first variant.

With all packages selected, a clean build of the 31 variants takes 46 s
instead of 114 s, and the packages do not change. Together with the
commit that lists every build variant only once, a build that has
nothing to do takes 17 s instead of 33 s, as the variants were the
longest chain of it.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>b029d56e0bd0c4e044c6e5d918e0da96223ab8da</id><msg>hostapd: build the variants in parallel</msg><path><editType>edit</editType><file>package/network/services/hostapd/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/libs/gettext-full/Makefile</affectedPath><commitId>b8d8bb9ba3084a7c611f02e06f3cba4e6ba6bbb2</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>gettext-full: enable parallel builds again

Commit 30fb675847 ("gettext-full: disable parallel compilation")
disabled parallel builds of gettext 0.21, as they failed with make -j12.

With gettext 0.24.2, the host and the target build passed four times
each with make -j24, and libintl-full does not change. The host build
takes 172 s instead of 231 s, and the target build 142 s instead of
214 s. With all packages selected, both are on the longest chain of a
clean build.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>b8d8bb9ba3084a7c611f02e06f3cba4e6ba6bbb2</id><msg>gettext-full: enable parallel builds again</msg><path><editType>edit</editType><file>package/libs/gettext-full/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tools/mtd-utils/Makefile</affectedPath><affectedPath>tools/erofs-utils/Makefile</affectedPath><affectedPath>tools/cpio/Makefile</affectedPath><commitId>3d597977b6616cc4206d5a95b134f13e581032b5</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>tools: build erofs-utils, mtd-utils and cpio in parallel

A tool builds with -j1 unless it sets HOST_BUILD_PARALLEL, and 45 of the
73 tools do not set it. These three gain the most from the job server on
a cold build of this tree:

  erofs-utils  23.11 s -&gt; 15.73 s
  mtd-utils    11.70 s -&gt;  6.42 s
  cpio          8.46 s -&gt;  3.56 s

Each one builds three times out of three with the job server, and each
build writes a tree that is identical to the one a serial build writes.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>3d597977b6616cc4206d5a95b134f13e581032b5</id><msg>tools: build erofs-utils, mtd-utils and cpio in parallel</msg><path><editType>edit</editType><file>tools/mtd-utils/Makefile</file></path><path><editType>edit</editType><file>tools/cpio/Makefile</file></path><path><editType>edit</editType><file>tools/erofs-utils/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/utils/mtd-utils/Makefile</affectedPath><affectedPath>package/libs/libsepol/Makefile</affectedPath><affectedPath>package/libs/libselinux/Makefile</affectedPath><commitId>bb332115ba1db784b05eabf258ab407aeff7f00e</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>package: build mtd-utils, libsepol and libselinux in parallel

A package builds with -j1 unless it sets PKG_BUILD_PARALLEL, and 171 of
the 220 packages do not set it. These three gain the most from the job
server on a cold build of this tree:

  mtd-utils   24.77 s -&gt; 6.43 s
  libsepol    17.99 s -&gt; 2.18 s
  libselinux   7.82 s -&gt; 1.89 s

mtd-utils runs while nothing else does, so its 18 s count against the
wall clock in full.

Each one builds three times out of three with the job server, and each
build writes a tree that is identical to the one a serial build writes.
nftables gains as well, 17.9 s to 13.0 s, but it is left alone: its
build directory differs between two serial builds, so the check that
covers the other three says nothing about it.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>bb332115ba1db784b05eabf258ab407aeff7f00e</id><msg>package: build mtd-utils, libsepol and libselinux in parallel</msg><path><editType>edit</editType><file>package/utils/mtd-utils/Makefile</file></path><path><editType>edit</editType><file>package/libs/libsepol/Makefile</file></path><path><editType>edit</editType><file>package/libs/libselinux/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/kernel.mk</affectedPath><commitId>a15df1972728e44802d78a8694915527966ea624</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>kernel: filter versioned kmod items in make

version_filter calls package-metadata.pl for every list that contains
a versioned item such as "foo@ge6.18". Parsing package/kernel/linux
runs it about 40 times, which takes 1.3 s of 2.2 s, and this parse is
on the critical path of every build.

Filter items of the form &lt;name&gt;@&lt;op&gt;&lt;version&gt; in make. The version
comparison stays in package-metadata.pl, but runs only once per
version. Other forms are passed to package-metadata.pl as before.

The only difference in the output: items without a version condition
are no longer passed through the shell, so quotes in a KCONFIG value
are kept. That list is only used for variable names, so the result is
the same. All kmod packages and images are identical.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>a15df1972728e44802d78a8694915527966ea624</id><msg>kernel: filter versioned kmod items in make</msg><path><editType>edit</editType><file>include/kernel.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>rules.mk</affectedPath><commitId>d29ffc6f39c383b9fc3e15b52837488c6d556a12</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: evaluate NPROC only once

NPROC is a recursive variable, so every use starts a shell. The image
Makefile expands the initramfs rule once per device, which runs nproc
about 200 times and makes the parse of the mediatek image Makefile take
about 1 s. It is parsed twice per build.

Evaluate it on first use and keep the result.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>d29ffc6f39c383b9fc3e15b52837488c6d556a12</id><msg>build: evaluate NPROC only once</msg><path><editType>edit</editType><file>rules.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/toplevel.mk</affectedPath><commitId>177325ba1a7860994aea060d861e1513ea91c5b4</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: compute REVISION and SOURCE_DATE_EPOCH once per build

The top-level Makefile calls itself for prereq and for the build, and
every call runs getver.sh and get_source_date_epoch.sh again, although
the values are already exported by the first call.

Take them from the environment in recursive calls. The first call still
computes them, so a value in the environment of the user is ignored as
before.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>177325ba1a7860994aea060d861e1513ea91c5b4</id><msg>build: compute REVISION and SOURCE_DATE_EPOCH once per build</msg><path><editType>edit</editType><file>include/toplevel.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/toplevel.mk</affectedPath><commitId>e3a89c4e4bcd25158690408cfc52886b4e67e602</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: detect the host triplet once per build

The top-level Makefile calls itself for prereq and for the build, and
every call runs config.guess again. config.guess runs the host C
compiler three times, which takes about 40 ms.

Take GNU_HOST_NAME from the environment in recursive calls, as for
REVISION and SOURCE_DATE_EPOCH.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>e3a89c4e4bcd25158690408cfc52886b4e67e602</id><msg>build: detect the host triplet once per build</msg><path><editType>edit</editType><file>include/toplevel.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/feeds.mk</affectedPath><commitId>f5fb15d8698ffd2feff34d30842a619544450c38</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: list the available feeds only when needed

feeds.mk runs "scripts/feeds list -n" when it is included, which
happens in every package Makefile. The list is only needed to find the
package directories of the feeds, which a package Makefile only does
when it creates or cleans a package.

Evaluate FEEDS_AVAILABLE on first use.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>f5fb15d8698ffd2feff34d30842a619544450c38</id><msg>build: list the available feeds only when needed</msg><path><editType>edit</editType><file>include/feeds.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>Makefile</affectedPath><commitId>6b009ee3eafe1dd1651ef49eb73180e94a4ee3e9</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: create the index, image info and checksums in one make call

world runs package/index, json_overview_image_info and checksum as
three separate calls of the top-level Makefile, and each call parses it
again. The calls run without -j, so one call with all three goals runs
them in the same order.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>6b009ee3eafe1dd1651ef49eb73180e94a4ee3e9</id><msg>build: create the index, image info and checksums in one make call</msg><path><editType>edit</editType><file>Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/host-build.mk</affectedPath><affectedPath>include/package.mk</affectedPath><affectedPath>include/depends.mk</affectedPath><commitId>842611776de08eaa24f1205a8bd7b93461667887</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: hash the package files only once per Makefile

Build/CoreTargets fixes the value of STAMP_PREPARED, but its expansion
references STAMP_PREPARED several times before that happens, and every
reference hashes all files of the package again with find and mkhash.
HOST_STAMP_PREPARED carries the same hash and the same cost.

Compute the hash on first use in PKG_FILES_MD5 and keep it. Both stamps
read it.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>842611776de08eaa24f1205a8bd7b93461667887</id><msg>build: hash the package files only once per Makefile</msg><path><editType>edit</editType><file>include/package.mk</file></path><path><editType>edit</editType><file>include/host-build.mk</file></path><path><editType>edit</editType><file>include/depends.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>rules.mk</affectedPath><commitId>43a9ff1c9430cf64891bcfaea5cdbe437c9f28a7</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: compute the hash of a config symbol list only once

confvar runs a shell and mkhash every time make expands a stamp name that
contains it, 21 times in a make call for a package with a host build,
also if nothing has to be done.

The config symbols do not change during a make call, so keep the hash
of each list of symbols after the first use.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>43a9ff1c9430cf64891bcfaea5cdbe437c9f28a7</id><msg>build: compute the hash of a config symbol list only once</msg><path><editType>edit</editType><file>rules.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/package.mk</affectedPath><commitId>a44d3e32563168b9022f779f567456e6efdcb013</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: find the source date of a package only once per directory

Make expands PKG_SOURCE_DATE_EPOCH for every recipe of a package, as
package-pack.mk exports it to the recipes. Every expansion runs
get_source_date_epoch.sh, which runs git.

Keep the result for each directory. The directory still depends on
whether the build directory has a version.date file.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>a44d3e32563168b9022f779f567456e6efdcb013</id><msg>build: find the source date of a package only once per directory</msg><path><editType>edit</editType><file>include/package.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/host-build.mk</affectedPath><commitId>64acf8343569ebc221e6d209d4daf92e37af3f6a</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: test for 64-bit time_t only when a host build needs it

host-build.mk runs the YEAR_2038 compiler test while it parses, so every
package with a host build runs it on every make call, also for a target
build or a build that has nothing to do.

Add the result to HOST_CONFIGURE_ARGS without expanding it, so the test
runs only when the host build is configured.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>64acf8343569ebc221e6d209d4daf92e37af3f6a</id><msg>build: test for 64-bit time_t only when a host build needs it</msg><path><editType>edit</editType><file>include/host-build.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/package-pack.mk</affectedPath><affectedPath>include/package.mk</affectedPath><commitId>9772acb4f7cb5892b99ccaf034b61ab9c4fe9126</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: only define the clean rule for packages not selected

BuildPackage expands the full BuildTarget/ipkg for every package in a
Makefile, whether it is selected or not. package/kernel/linux defines
more than 1000 kmods, and this takes about 0.9 s of its 1.2 s parse,
which is on the critical path of every build.

Move the clean rule into BuildTarget/ipkg/disabled, and only expand it
for packages that are not selected, unless DEVELOPER is set. The other
rules of such a package can not be reached, as its compile target only
depends on them if the package is selected. Target types without a
disabled variant are expanded as before.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>9772acb4f7cb5892b99ccaf034b61ab9c4fe9126</id><msg>build: only define the clean rule for packages not selected</msg><path><editType>edit</editType><file>include/package-pack.mk</file></path><path><editType>edit</editType><file>include/package.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/image.mk</affectedPath><commitId>6258a11bacdb5840b40a7a35e7f60b8d68a6eaab</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>image: only define the rules of selected devices

A target defines more than 100 devices, and the image Makefile
expands the kernel, image and artifact rules of every one of them. The
rules of a device that is not selected are only reachable through
install-disabled and compile-disabled, so nothing uses them. The image
Makefile is parsed twice per build, 0.3 s each for mediatek.

Only expand Device/Build for selected devices, and for all devices if
CONFIG_IB is set, as the ImageBuilder compiles them all.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>6258a11bacdb5840b40a7a35e7f60b8d68a6eaab</id><msg>image: only define the rules of selected devices</msg><path><editType>edit</editType><file>include/image.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/subdir.mk</affectedPath><commitId>407e8331402f94e1eae5addda38fdf5a90afdcd6</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: expand the subdir recipes only when they run

subdir expands the recipe of every target of every build directory when
it creates the rules, although make runs only a few of them. The main
Makefile creates these rules on every make call, and a build calls it
several times in a row.

Put only a call of the recipe into the rules, so that make expands it
when the recipe runs. The commands do not change. The parse of the main
Makefile takes 0.10 s instead of 0.15 s, with 318 package directories.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>407e8331402f94e1eae5addda38fdf5a90afdcd6</id><msg>build: expand the subdir recipes only when they run</msg><path><editType>edit</editType><file>include/subdir.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/subdir.mk</affectedPath><commitId>bc96efb443fd683e02e2c3fc625f72ed55ecb8b0</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: find the alias of a build directory with notdir

subdir calls diralias twice for every target of every build directory,
and diralias splits the path into words twice to find its last
component. This takes a quarter of the parse time of the main Makefile.

Use notdir, which returns the same last component. The rules do not
change.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>bc96efb443fd683e02e2c3fc625f72ed55ecb8b0</id><msg>build: find the alias of a build directory with notdir</msg><path><editType>edit</editType><file>include/subdir.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/kernel-build.mk</affectedPath><affectedPath>scripts/build-time-log.sh</affectedPath><affectedPath>rules.mk</affectedPath><affectedPath>scripts/build-time-report.pl</affectedPath><affectedPath>include/host-build.mk</affectedPath><affectedPath>include/package.mk</affectedPath><commitId>b95b0928ac7135322dd3d42c19d489ede35bf121</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: add per stage build time profiling

Set BUILD_TIME_LOG=&lt;file&gt; to record a begin and an end event for every
prepare, configure, compile and install stage of every tool, toolchain
component, kernel and package. scripts/build-time-report.pl turns the log
into a report.

The report divides each second of the build between the stages that run
in it, so the numbers show which stages hold up the wall clock rather
than which ones burn the most CPU. Nothing is recorded and no extra
process runs when BUILD_TIME_LOG is unset.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>b95b0928ac7135322dd3d42c19d489ede35bf121</id><msg>build: add per stage build time profiling</msg><path><editType>edit</editType><file>include/package.mk</file></path><path><editType>edit</editType><file>include/kernel-build.mk</file></path><path><editType>edit</editType><file>rules.mk</file></path><path><editType>edit</editType><file>include/host-build.mk</file></path><path><editType>add</editType><file>scripts/build-time-log.sh</file></path><path><editType>add</editType><file>scripts/build-time-report.pl</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/kernel-defaults.mk</affectedPath><commitId>714886f3e4f0d4f5eb8ec299edcfd137c409c8d0</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>kernel: build the separate initramfs kernel only once

With TARGET_ROOTFS_INITRAMFS_SEPARATE, the initramfs kernel differs
from the regular kernel only in CONFIG_RD_&lt;ALGO&gt;. Both are built in the
same tree, so every build switches the kernel config twice and relinks
vmlinux twice, even if nothing changed.

Give the regular kernel the same ramdisk support and use its image for
the initramfs as is. The initramfs step now only creates the initrd.
Remove the separate initramfs branches of Kernel/SetInitramfs, as it is
no longer called in this mode.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>714886f3e4f0d4f5eb8ec299edcfd137c409c8d0</id><msg>kernel: build the separate initramfs kernel only once</msg><path><editType>edit</editType><file>include/kernel-defaults.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/kernel-defaults.mk</affectedPath><commitId>9d84fbff3670153e3ec8415304cdd376022ba163</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>kernel: skip kbuild if the kernel tree did not change

kbuild runs twice per build, for the modules and for the image, and
takes about half a second each time even if there is nothing to do.

Store a hash of the kbuild command line after a successful run, and
skip the next run if the hash is the same and no file in the kernel
tree or the toolchain is newer than the stamp. The OpenWrt files at the
top of the kernel tree are ignored, apart from .config. Directories are
ignored, as kbuild changes them with temporary files, so a deleted file
alone does not trigger a run.

With CONFIG_STRIP_KERNEL_EXPORTS the image link reads symtab.h, which
sits above the kernel tree and follows the modules of the packages. The
scan of the image run names that file as well.

The workaround that deletes vmlinux now only runs together with kbuild.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>9d84fbff3670153e3ec8415304cdd376022ba163</id><msg>kernel: skip kbuild if the kernel tree did not change</msg><path><editType>edit</editType><file>include/kernel-defaults.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/toplevel.mk</affectedPath><commitId>cb18fbc331a45d999860b1f7f7b89d1b7e2dc5be</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: regenerate package metadata only after it changed

prepare-tmpinfo runs on every build and calls package-metadata.pl
three times, although tmp/.packageinfo usually did not change. It also
writes tmp/.config-feeds.in on every build: the check against
tmp/.packageauxvars never passes, as that file is written again later
in the same recipe.

Generate the package metadata files only if tmp/.packageinfo or the
scripts are newer, and replace tmp/.config-feeds.in only if its content
changed.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>cb18fbc331a45d999860b1f7f7b89d1b7e2dc5be</id><msg>build: regenerate package metadata only after it changed</msg><path><editType>edit</editType><file>include/toplevel.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/toplevel.mk</affectedPath><commitId>e7d105af30a79f55da5a41315943b2c1d12878f9</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: skip the .config sync check if nothing changed

Every build runs conf --defconfig on a copy of .config to warn if the
configuration is out of sync. This takes about a second before the
build starts.

Skip the check if the last one passed, and neither .config nor a
Kconfig file, the generated Kconfig files or conf changed since then.
If the check fails, it runs and warns again on every build, as before.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>e7d105af30a79f55da5a41315943b2c1d12878f9</id><msg>build: skip the .config sync check if nothing changed</msg><path><editType>edit</editType><file>include/toplevel.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/Makefile</affectedPath><commitId>bc2e85eb8df05e8e1e5a7542c243b33fcbbf6365</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: clean the package root dir only if the packages can have changed

The stamp of package/cleanup depends on tmp/.build, which is touched on
every make call, so every build deletes $(STAGING_DIR_ROOT) and every
package copies its files into it again, one after the other under a
lock. With all packages selected, this takes 5 s of a build that has
nothing to do, most of it in the 1102 kmods of package/kernel/linux.

Only clean it if .config, the package metadata or a file below package/
changed since the last cleanup. An edit of the source in a build
directory alone does not clean it, so a file that such an edit removes
from a package stays until then. make package/cleanup cleans it at any
time.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>bc2e85eb8df05e8e1e5a7542c243b33fcbbf6365</id><msg>build: clean the package root dir only if the packages can have changed</msg><path><editType>edit</editType><file>package/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>scripts/timestamp.pl</affectedPath><commitId>3cf47c5c17dc2ec3ecab578a1fd4d723bb6b3f9b</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: compare timestamps with a fraction of a second

timestamp.pl decides whether a subdir has work to do. It scans the stamp
file and the source directories, keeps the newest, and reports that the
work is done when the newest one is the stamp. The scan reads the mtime
through the core stat of perl, which truncates it to whole seconds, and
the comparison is strict with the stamp scanned first. Two files that
share a second therefore count as a tie, and a tie says that the work is
done.

include/subdir.mk touches tmp/.build at the start of a build and the
stamp of a subdir at the end, so the two land in the same second once a
build takes less than a second between them. The target install stamp is
the last one of a build, roughly 0.4 s before the build ends, so it is
the one that ties first: the next build then skips target/install and
ships the images of the previous build. Around one build in five was
affected once the build became fast enough.

Read the mtime through Time::HiRes, which reports the fraction as well.
Two touches around a fork no longer share a timestamp. Keep the core
stat where the module is missing, which restores the old behaviour
rather than failing.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>3cf47c5c17dc2ec3ecab578a1fd4d723bb6b3f9b</id><msg>build: compare timestamps with a fraction of a second</msg><path><editType>edit</editType><file>scripts/timestamp.pl</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/Makefile</affectedPath><commitId>3054effc90f343ebd2c2eae9319de4b671052836</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: rebuild the package index only when a package changed

package/index runs apk mkndx and make-index-json.py over every package
on each build, which takes 1.2 s of a no-op build of this tree with 1258
packages. The result depends only on the package files.

Skip the pass while packages.adb and index.json exist and no package
file, and no directory, is newer than index.json. The directory covers a
package that was added or removed, because neither changes a file that
is left. The comparison uses index.json rather than packages.adb,
because apk mkndx writes packages.adb through a rename, which sets the
mtime of the directory to that of the file it wrote. The directory would
then tie with packages.adb and the skip would rest on the two comparing
equal. index.json is written after it, so the directory is older.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>3054effc90f343ebd2c2eae9319de4b671052836</id><msg>build: rebuild the package index only when a package changed</msg><path><editType>edit</editType><file>package/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>rules.mk</affectedPath><commitId>d8442d2876d97ea4ef98c51c688af971e44e5788</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: write the checksum file only when a file changed

sha256sums hashes every file of a directory on each build. package/index
calls it over the package output of this tree, which holds 1258 files,
and spends 0.7 s of a no-op build on a file that does not change.

Skip the pass while the file exists and nothing in the directory is
newer than it.

The checksum target of a build calls sha256sums as well, but it keeps
writing the file on every build. buildversion and feedsversion rewrite
version.buildinfo and feeds.buildinfo beside it without a guard, so the
directory always holds something newer. Only package/index gains here.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>d8442d2876d97ea4ef98c51c688af971e44e5788</id><msg>build: write the checksum file only when a file changed</msg><path><editType>edit</editType><file>rules.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>Makefile</affectedPath><commitId>af60df881d1e5e221ecdf1e64444366c9ae9f603</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: run diffconfig only when the configuration changed

diffconfig.sh runs the configuration parser over the whole tree twice,
which takes 2 s of every build, and buildinfo runs it on each build.
The result depends only on .config and the Kconfig files.

Skip it while neither is newer than the file it wrote last time.
include/toplevel.mk guards the sync check of .config the same way.

This alone changes nothing on a parallel build, because buildinfo runs
beside the compile stamps. It pays once the other phases become shorter.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>af60df881d1e5e221ecdf1e64444366c9ae9f603</id><msg>build: run diffconfig only when the configuration changed</msg><path><editType>edit</editType><file>Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/Makefile</affectedPath><commitId>8d2564302560bea292ba4050df444404e32527ef</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: merge the packages only when the set of packages changed

package/merge deletes the symlink farm of every built package and creates
it again on every build. package/merge-index then reads all of those
packages to create the index. With two thousand packages both steps take a
third of a second, and the cost grows with the size of the configuration.

Record the name, the size and the timestamp of every package file. Skip
both steps while that list is unchanged and the index is present. A rebuild
of the symlinks drops the index, so merge-index creates it again.

This takes the time of package/install on an unchanged tree from 1.05 s to
0.60 s for the OpenWrt One.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>8d2564302560bea292ba4050df444404e32527ef</id><msg>build: merge the packages only when the set of packages changed</msg><path><editType>edit</editType><file>package/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/kernel-build.mk</affectedPath><commitId>746c76168c231a3d5f4fb8de4727b8e11f0645b5</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: create the images only when an input changed

target/linux install runs the whole image build on every build. It creates
the root file system image, the kernel images, the FIT containers and the
factory images again, although the inputs are the same. This takes 0.7 s for
the OpenWrt One and much more for a target with many devices.

Record a state after a successful image build:

 - a hash of the target directory, because the build normalises the
   timestamps of the root file system and they cannot report a change,
 - the name and the size of every image in the output directory, so that a
   deleted image brings the build back,
 - the name and the size of every file below json_info_files, because
   image_prepare drops that directory and profiles.json comes from it.

Skip the image build while the state is the same and no file of the kernel
build directory, the kernel tree, the image directory of the staging
directory, the host tools, the target directory of the tree, include,
scripts or .config is newer than the state file.

This takes the time of target/linux install on an unchanged tree from 1.77 s
to 1.33 s, and the time of a full no-op build from 4.11 s to 3.72 s for the
OpenWrt One.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>746c76168c231a3d5f4fb8de4727b8e11f0645b5</id><msg>build: create the images only when an input changed</msg><path><editType>edit</editType><file>include/kernel-build.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/kernel-build.mk</affectedPath><commitId>e97e3f36bd5d48add83c5c7fba907600b12a653c</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>kernel: configure the kernel only when an input changed

The configure stage rewrites the kernel configuration on every build. It
runs kconfig.pl twice and package-metadata.pl once, which takes an eighth of
a second. target/compile and target/install both pay it.

The rule carries FORCE because the kernel configuration also depends on the
package metadata, which is not a prerequisite. Add a check file that the
rule creates only when the configure stage must run, and make the stamp
depend on it. The check covers the kernel configuration files, .config, the
package metadata, the scripts that read them, the two build system files
that hold the recipe, the target directory and the user headers.

This takes the time of target/linux install on an unchanged tree from 1.33 s
to 1.15 s, and the time of a full no-op build from 3.68 s to 3.40 s for the
OpenWrt One.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>e97e3f36bd5d48add83c5c7fba907600b12a653c</id><msg>kernel: configure the kernel only when an input changed</msg><path><editType>edit</editType><file>include/kernel-build.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/toplevel.mk</affectedPath><commitId>0e5a0bd5581a1360230759cd35623db1fd01f5be</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: scan the package and target metadata only after a change

prepare-tmpinfo runs the metadata scan for the packages and for the targets
on every build. Each run starts two more make processes and walks the whole
directory, which takes 0.15 s per scan even when it finds nothing to do.

Keep a stamp per scan and skip the scan while no Makefile, no .mk file and
no directory below the scanned tree is newer than the stamp, and while
include, rules.mk and .config are unchanged as well.

package/kernel/linux reads target/linux/*/modules.mk through SCAN_DEPS, so
the package scan watches those files although they sit in the target tree.

This takes the time of the prereq step from 0.45 s to 0.21 s, and the time
of a full no-op build from 3.40 s to 3.25 s for the OpenWrt One.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>0e5a0bd5581a1360230759cd35623db1fd01f5be</id><msg>build: scan the package and target metadata only after a change</msg><path><editType>edit</editType><file>include/toplevel.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>Makefile</affectedPath><affectedPath>rules.mk</affectedPath><commitId>ac4f1dd36ce8c3b3c06652780d86056d78efa642</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: write the build info files only when they change

buildversion, feedsversion and json_overview_image_info rewrite
version.buildinfo, feeds.buildinfo and profiles.json on every build. The
content is the same, but the new timestamp makes the checksum step hash
every image again, which takes 0.18 s for the OpenWrt One and grows with the
number of devices.

Write the three files to the temporary directory and copy them over the
result of the last build only when the content differs.

This takes the time of the index, image info and checksum step from 0.36 s
to 0.10 s, and the time of a full no-op build from 3.25 s to 3.00 s.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>ac4f1dd36ce8c3b3c06652780d86056d78efa642</id><msg>build: write the build info files only when they change</msg><path><editType>edit</editType><file>Makefile</file></path><path><editType>edit</editType><file>rules.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>scripts/timestamp.pl</affectedPath><commitId>b5c4b58764f34556af41326cca6354bc723b1ba5</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: let find answer the rebuild question

The -n caller of timestamp.pl only needs to know whether the stamp is the
newest file. The script reads the timestamp of every file to answer that,
which costs 0.09 s for the build directory of U-Boot with its 44000 files.
The rebuild check runs the script twice per package and per build.

Collect the paths first, and for -n ask find for the first file that is
newer than the stamp. find stops at that file, so the walk ends early when
there is work to do. The other modes keep the old code, and so does -n with
-follow, because find and the script treat a symbolic link to a file
differently there.

The check over the U-Boot build directory now takes 0.02 s. The result is
the same for all 44 build directories of the OpenWrt One. The time of a full
no-op build does not change on a machine with 24 cores, where the package
step waits for the dependency chain rather than for the checks.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>b5c4b58764f34556af41326cca6354bc723b1ba5</id><msg>build: let find answer the rebuild question</msg><path><editType>edit</editType><file>scripts/timestamp.pl</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/download.mk</affectedPath><commitId>f7adeacb6265eb7236d15dec831b1b7f1bd880e4</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: hash downloaded files only after they changed

check_download_integrity hashes the downloaded file on every parse of
every Makefile that uses it. With large archives this costs seconds per
build, for example about 1.2 s for linux-firmware, which is on the
critical path of the package build.

Remember the identity (inode, size, mtime, ctime) of a file that
matched its expected hash, and hash it again only after it changed.

The identity comes from the stat of tools/coreutils, which a Linux host
does not build. Fall back to the stat of the host, and drop the cache
when neither one answers, so that a missing stat costs time and never
trust.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>f7adeacb6265eb7236d15dec831b1b7f1bd880e4</id><msg>build: hash downloaded files only after they changed</msg><path><editType>edit</editType><file>include/download.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/image-commands.mk</affectedPath><affectedPath>include/kernel-defaults.mk</affectedPath><affectedPath>scripts/cache-run.sh</affectedPath><affectedPath>rules.mk</affectedPath><commitId>c6a1bf59665544d6f8e2718006e2c39385584cea</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: reuse the output of slow compression steps

On a rebuild, the initrd and the initramfs kernel image usually have
the same content as before, but xz and lzma compress them again on
every build. For the OpenWrt One this takes about 6 s of the build.

Add scripts/cache-run.sh. It runs a command that creates one file from
another, and stores the output together with a hash of the input, the
command line and the tool. If they are the same in the next run, it
copies the stored output instead. The commands are deterministic, so
the result is identical.

On a hit the script compares the stored output with the file that is
already there and copies only when the two differ. The output then keeps
its timestamp, so a later step that compares timestamps does not treat it
as new work.

Use it for the initrd compression and for Build/lzma. bzip2 and lzop
stay as they are: bzip2 writes to stdout, and lzop stores the mtime of
its input. xz and gzip now keep the cpio, as the other tools do, so a
cache hit leaves the same files behind as a normal run.

The slot name follows the path of the output below $(KDIR), because two
targets in different directories can share a basename. cache-run.sh holds
a lock over the slot and swaps the stored output in with a rename, so two
image recipes on one slot never read a half written pair.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>c6a1bf59665544d6f8e2718006e2c39385584cea</id><msg>build: reuse the output of slow compression steps</msg><path><editType>edit</editType><file>rules.mk</file></path><path><editType>add</editType><file>scripts/cache-run.sh</file></path><path><editType>edit</editType><file>include/image-commands.mk</file></path><path><editType>edit</editType><file>include/kernel-defaults.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/image-commands.mk</affectedPath><commitId>5b3be62345bde6ecabb1869a8a9a86abd1316c23</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: reuse the output of Build/libdeflate-gzip

libdeflate-gzip -12 of a kernel takes about a second, and its input
usually did not change. Run it through cache-run.sh, as Build/lzma.

libdeflate-gzip stores no mtime or file name, and -k -S .new gives the
same output as -c.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>5b3be62345bde6ecabb1869a8a9a86abd1316c23</id><msg>build: reuse the output of Build/libdeflate-gzip</msg><path><editType>edit</editType><file>include/image-commands.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/Makefile</affectedPath><commitId>48c1e36bf2b8cbe1bfa07cc129cbc833d977d501</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>package: reuse the rootfs if its inputs did not change

The rootfs is installed from scratch on every build: apk add, then the
post-install and init scripts of every package, one after the other.
This takes about 1.5 s, even if no package changed.

Build a key from the package index, which holds a hash of every
package, the install list, .config, SOURCE_DATE_EPOCH, the files
overlay, apk, tar, gzip and the Makefiles that create the rootfs. Save
a copy of the rootfs with the key, and restore it from the copy if the
key did not change. Later build steps modify the rootfs, so it is
always restored from the copy and never reused in place.

prepare_rootfs runs tar and gzip over the apk script archive, so the
key holds those two host tools as well. With mklibs it also runs
rstrip.sh, which the key then holds too.

The install list now holds the base-files, libc and kernel versions
too, so that the key can use it. Only the APK path uses the cache.

The copy costs disk: the build directory carries the root filesystem
twice, once as root and root.orig and once in the cache.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>48c1e36bf2b8cbe1bfa07cc129cbc833d977d501</id><msg>package: reuse the rootfs if its inputs did not change</msg><path><editType>edit</editType><file>package/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>rules.mk</affectedPath><affectedPath>include/site/cache</affectedPath><affectedPath>include/host-build.mk</affectedPath><affectedPath>include/package.mk</affectedPath><commitId>a0b036985afc5dd36a93faba1119b55b89780a3b</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: cache the autoconf results of a package that opts in

A configure run spends its time on the compiler invocations behind its
checks, not on the shell. tools/m4 runs the compiler 633 times and takes
24 seconds. ccache does not help, because it refuses to cache an
autoconf conftest compile at all; it counts these separately as
"Autoconf compile/link" under its uncacheable calls.

A package that sets PKG_CONFIGURE_CACHE or HOST_CONFIGURE_CACHE keeps a
config.cache under tmp/, so a package that is cleaned and built again
reads the answers instead of running the checks. The configure stage of
tools/m4 drops from 24.5 s to 1.5 s. dirclean removes tmp/, so a full
reset of the tree starts from cold answers.

A package has to opt in, because a cache is only correct for a configure
script that keeps its side effects outside the AC_CACHE_VAL body.
ncurses appends -D_XOPEN_SOURCE and -D_DEFAULT_SOURCE to CPPFLAGS inside
that body, so a cached run restores the value, skips the append, and
then fails to compile wcwidth. ncurses_cfg.h is identical in both cases;
the difference is in the generated Makefile.

The path covers everything else that changes an answer. A target package
is keyed on the toolchain directory, which carries the gcc version. A
host package is keyed on the version string of the host compiler,
because autoconf cannot detect a new compiler behind an unchanged name;
gcc 14 turned an implicit function declaration into an error and changed
many answers that way. Both are keyed on a hash of the configure
arguments and the build flags, and autoconf refuses a cache written with
different flags on top of that.

A cached program path outlives a wipe of staging_dir, so ac_cv_path_ and
ac_cv_prog_ answers are dropped when the cache loads and configure
searches PATH again. Without that, a cache written before staging_dir
held sed pins /usr/bin/sed for good. A search runs no compiler, so this
costs nothing that matters.

The cache arrives through a site script rather than --cache-file, so a
hand written configure script never sees a new argument. The site script
removes the file of the previous arguments, so a different configuration
gets a cold cache instead of an autoconf error. It also unsets the
variable, and make exports it for the configure stage alone, so a nested
configure run keeps its own cache.

Set CONFIGURE_CACHE_DIR to keep the cache elsewhere, or to the empty
string to run every check again.

Host builds now read a site script on Linux as well. Before this change
only Darwin had one.

CONFIG_SITE holds one path name: autoconf before 2.70 reads the whole
value as that one name, so a second path would silence both scripts. It
names the cache script alone, and the cache script loads the site script
of the architecture from CONFIG_SITE_BASE.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>a0b036985afc5dd36a93faba1119b55b89780a3b</id><msg>build: cache the autoconf results of a package that opts in</msg><path><editType>add</editType><file>include/site/cache</file></path><path><editType>edit</editType><file>include/host-build.mk</file></path><path><editType>edit</editType><file>rules.mk</file></path><path><editType>edit</editType><file>include/package.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tools/tar/Makefile</affectedPath><affectedPath>tools/m4/Makefile</affectedPath><affectedPath>tools/bison/Makefile</affectedPath><affectedPath>tools/patch/Makefile</affectedPath><affectedPath>tools/findutils/Makefile</affectedPath><affectedPath>tools/cpio/Makefile</affectedPath><affectedPath>tools/e2fsprogs/Makefile</affectedPath><affectedPath>tools/elfutils/Makefile</affectedPath><affectedPath>tools/gmp/Makefile</affectedPath><affectedPath>tools/sed/Makefile</affectedPath><commitId>cd322612ccb66e35878ed7f9d3e562f9f4b4bd09</commitId><timestamp>1790093938000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>tools: cache the configure results of ten autotools tools

These ten hold up the wall clock on their own. Their configure stages
run while nothing else does, because the tools build in dependency
order. Measured over a full build, cold cache against warm:

  sed        21.68 s -&gt; 1.22 s
  m4         21.48 s -&gt; 1.22 s
  findutils  19.47 s -&gt; 1.56 s
  tar        17.75 s -&gt; 1.47 s
  cpio       14.28 s -&gt; 1.26 s
  bison      12.81 s -&gt; 1.29 s
  patch      12.16 s -&gt; 1.31 s
  elfutils   26.58 s -&gt; 15.47 s

Each of the ten configures the same way with a warm cache as it does
without one. The check runs configure three times, without a cache, with
a cold cache and with a warm cache, and compares every file that
configure generates between the first and the last. ncurses fails that
check; these do not.

The only difference left is ac_ct_AR and ac_ct_RANLIB, which a cold run
fills through the fallback path of AC_CHECK_TOOL and a warm run leaves
empty. AR and RANLIB are correct in both, and no generated Makefile
reads the ac_ct_ form.

tools/cmake keeps its 33 s, the longest configure stage in the build. It
bootstraps with its own script rather than autoconf, so this does not
reach it.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:18:58 +0200</date><id>cd322612ccb66e35878ed7f9d3e562f9f4b4bd09</id><msg>tools: cache the configure results of ten autotools tools</msg><path><editType>edit</editType><file>tools/elfutils/Makefile</file></path><path><editType>edit</editType><file>tools/patch/Makefile</file></path><path><editType>edit</editType><file>tools/cpio/Makefile</file></path><path><editType>edit</editType><file>tools/bison/Makefile</file></path><path><editType>edit</editType><file>tools/gmp/Makefile</file></path><path><editType>edit</editType><file>tools/sed/Makefile</file></path><path><editType>edit</editType><file>tools/findutils/Makefile</file></path><path><editType>edit</editType><file>tools/e2fsprogs/Makefile</file></path><path><editType>edit</editType><file>tools/m4/Makefile</file></path><path><editType>edit</editType><file>tools/tar/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/system/apk/Makefile</affectedPath><affectedPath>package/system/apk/patches/0012-crypto_openssl-use-deterministic-ECDSA-signatures.patch</affectedPath><commitId>e923974fc1720954f04e3916072fda1fb14efc98</commitId><timestamp>1790095590000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>apk: use deterministic ECDSA signatures

The host apk signs with LibreSSL, which uses a random ECDSA nonce. A
package that is signed again has different bytes and often a different
size, even if its content did not change. The rootfs records the
package size in /lib/apk/db/installed, so a rebuild of one package
changes all images.

Add a patch that derives the nonce as specified in RFC 6979. Signed
packages and images are now identical after a rebuild.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:46:30 +0200</date><id>e923974fc1720954f04e3916072fda1fb14efc98</id><msg>apk: use deterministic ECDSA signatures</msg><path><editType>edit</editType><file>package/system/apk/Makefile</file></path><path><editType>add</editType><file>package/system/apk/patches/0012-crypto_openssl-use-deterministic-ECDSA-signatures.patch</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/trusted-firmware-a.mk</affectedPath><commitId>1e7c8fbc299665a3afe67773752cd14f35d7ec56</commitId><timestamp>1790095590000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>trusted-firmware-a: use a reproducible build timestamp

TF-A embeds __TIME__ and __DATE__ in its build message, so bl2 and bl31
differ on every build, and so do all images that contain them.

Pass BUILD_MESSAGE_TIMESTAMP, derived from the source date of the
package, in the same format.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:46:30 +0200</date><id>1e7c8fbc299665a3afe67773752cd14f35d7ec56</id><msg>trusted-firmware-a: use a reproducible build timestamp</msg><path><editType>edit</editType><file>include/trusted-firmware-a.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tools/yafut/patches/100-honour-SOURCE_DATE_EPOCH.patch</affectedPath><affectedPath>tools/yafut/Makefile</affectedPath><commitId>ec4768fbed8ea3b09e323cb267db0714a7d68eb7</commitId><timestamp>1790095590000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>yafut: use a reproducible timestamp

yaffsfs_CurrentTime() returns the wall clock, and Yaffs writes that value
to the access, modification and change time of every object header. The
RouterBOARD images of ipq40xx/mikrotik therefore differ on every build,
and so does the sysupgrade metadata checksum that follows them.

Add a patch that reads SOURCE_DATE_EPOCH, which the build already exports.

Tested with two images written one second apart. They are identical with
SOURCE_DATE_EPOCH set and differ without it.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:46:30 +0200</date><id>ec4768fbed8ea3b09e323cb267db0714a7d68eb7</id><msg>yafut: use a reproducible timestamp</msg><path><editType>add</editType><file>tools/yafut/patches/100-honour-SOURCE_DATE_EPOCH.patch</file></path><path><editType>edit</editType><file>tools/yafut/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/boot/uboot-mxs/Makefile</affectedPath><affectedPath>package/boot/uboot-mxs/patches/0002-tools-mxsimage-honour-SOURCE_DATE_EPOCH.patch</affectedPath><commitId>3a33c694aaa019d5a5619099d385b5bc12ebff3f</commitId><timestamp>1790095590000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>uboot-mxs: use a reproducible build timestamp

mkimage -T mxsimage builds u-boot.sb. sb_get_timestamp() reads the wall
clock and sb_prefill_image_header() writes it to the boot image header.
The header digest covers that field, so the sdcard images of mxs differ on
every build.

Add a patch that uses imagetool_get_source_date(), which the other image
tools already use, and keep the wall clock as the fallback.

Tested with the mxsimage configuration of u-boot. Two images are identical
with the same SOURCE_DATE_EPOCH, differ with different values, and still
differ when the variable is not set.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:46:30 +0200</date><id>3a33c694aaa019d5a5619099d385b5bc12ebff3f</id><msg>uboot-mxs: use a reproducible build timestamp</msg><path><editType>add</editType><file>package/boot/uboot-mxs/patches/0002-tools-mxsimage-honour-SOURCE_DATE_EPOCH.patch</file></path><path><editType>edit</editType><file>package/boot/uboot-mxs/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/generic/pending-6.12/303-MIPS-vdso-keep-the-prefix-map-flags.patch</affectedPath><affectedPath>target/linux/generic/pending-6.18/303-MIPS-vdso-keep-the-prefix-map-flags.patch</affectedPath><commitId>0995a0e3511218deb4a492f28a9e181d3c2ca92b</commitId><timestamp>1790095590000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>kernel: make the MIPS vDSO build id independent of the build path

arch/mips/vdso/Makefile takes a few flags from KBUILD_CFLAGS and adds -g,
so the vDSO always carries debug information. -ffile-prefix-map is not in
that list, so DW_AT_comp_dir of the vDSO objects holds the absolute build
directory. The vDSO is linked with --build-id=sha1, which hashes the debug
information, and objcopy -S then removes the debug information and keeps
the note. The kernel embeds that image.

Every MIPS image therefore depends on the name of the build directory. The
reproducible build service works in a directory with a random name, so it
reports all MIPS targets as different. The ARM architectures add their vDSO
flags on top of KBUILD_CFLAGS and are not affected.

Add a patch to 6.12 and to 6.18 that takes the two prefix map flags over
from KBUILD_CFLAGS.

Tested with two ath79/nand builds in directories of different name. Before
the patch the vDSO build ids differ and all 91 images differ. After the
patch the build ids match and all 91 images are identical.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:46:30 +0200</date><id>0995a0e3511218deb4a492f28a9e181d3c2ca92b</id><msg>kernel: make the MIPS vDSO build id independent of the build path</msg><path><editType>add</editType><file>target/linux/generic/pending-6.18/303-MIPS-vdso-keep-the-prefix-map-flags.patch</file></path><path><editType>add</editType><file>target/linux/generic/pending-6.12/303-MIPS-vdso-keep-the-prefix-map-flags.patch</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/generic/pending-6.18/304-LoongArch-vdso-keep-the-prefix-map-flags.patch</affectedPath><affectedPath>target/linux/generic/pending-6.12/304-LoongArch-vdso-keep-the-prefix-map-flags.patch</affectedPath><commitId>115209aa225a9b2d8b849809eaa4969de8e8c539</commitId><timestamp>1790095590000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>kernel: make the LoongArch vDSO build id independent of the build path

The LoongArch vDSO Makefile builds its objects with a flag set of its own,
in the same way as the MIPS one. It drops -ffile-prefix-map, adds -g and
links with --build-id, so the build id of the vDSO follows the absolute
path of the build directory. The kernel embeds the vDSO, so two builds in
different directories produce different images.

Take the prefix map flags over from KBUILD_CFLAGS.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:46:30 +0200</date><id>115209aa225a9b2d8b849809eaa4969de8e8c539</id><msg>kernel: make the LoongArch vDSO build id independent of the build path</msg><path><editType>add</editType><file>target/linux/generic/pending-6.18/304-LoongArch-vdso-keep-the-prefix-map-flags.patch</file></path><path><editType>add</editType><file>target/linux/generic/pending-6.12/304-LoongArch-vdso-keep-the-prefix-map-flags.patch</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/ixp4xx/image/Makefile</affectedPath><affectedPath>target/linux/ramips/image/mt76x8.mk</affectedPath><affectedPath>target/linux/ipq40xx/image/generic.mk</affectedPath><affectedPath>scripts/linksys-image.sh</affectedPath><affectedPath>target/linux/qualcommax/image/ipq60xx.mk</affectedPath><affectedPath>target/linux/bcm53xx/image/Makefile</affectedPath><affectedPath>target/linux/qualcommax/image/ipq807x.mk</affectedPath><commitId>8e7a8a2b9210481adbfbfe42aa37cfc804817674</commitId><timestamp>1790095590000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>image: create the archive images with fixed metadata

Several image recipes call tar without the options that pin the member
order, the owner, the mode and the modification time. The archive then
holds the build time, the umask of the build user and the readdir order of
the build directory, so two builds of the same source produce different
images.

Pass the same options that Image/mkfs/targz and sysupgrade-tar.sh already
use. The recipes define no member order, so sorting the members takes
nothing away. The diffoscope of the published WAX610 archive shows the
order differing between the build machines, which is what a readdir order
produces.

--mode=go-w clears the write bit of the group and of the others. tar keeps
the mode of the file on disk, which follows the umask of the build user,
so without it the archive differs between a host with umask 022 and one
with umask 002.

Covers the Netgear factory archives of ipq40xx, ipq60xx and ipq807x, the
Creality factory archive of mt76x8, the D-Link DWL8610AP archive of
bcm53xx, the Freecom archive of ixp4xx and the Linksys switch archive of
realtek.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:46:30 +0200</date><id>8e7a8a2b9210481adbfbfe42aa37cfc804817674</id><msg>image: create the archive images with fixed metadata</msg><path><editType>edit</editType><file>target/linux/qualcommax/image/ipq807x.mk</file></path><path><editType>edit</editType><file>target/linux/ipq40xx/image/generic.mk</file></path><path><editType>edit</editType><file>scripts/linksys-image.sh</file></path><path><editType>edit</editType><file>target/linux/qualcommax/image/ipq60xx.mk</file></path><path><editType>edit</editType><file>target/linux/ixp4xx/image/Makefile</file></path><path><editType>edit</editType><file>target/linux/bcm53xx/image/Makefile</file></path><path><editType>edit</editType><file>target/linux/ramips/image/mt76x8.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/image/Makefile</affectedPath><commitId>92f41f89436d33e1dbb7ac6e9aa8c5f0326e4e37</commitId><timestamp>1790095590000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>realtek: use a reproducible timestamp in the 7z kernel container

7zr stores the modification time of the input file. The kernel image
carries the build time, so the H3C and HPE images differ between builds.

Set the time of the input to SOURCE_DATE_EPOCH before the archive is
created.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:46:30 +0200</date><id>92f41f89436d33e1dbb7ac6e9aa8c5f0326e4e37</id><msg>realtek: use a reproducible timestamp in the 7z kernel container</msg><path><editType>edit</editType><file>target/linux/realtek/image/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/boot/uboot-mediatek/Makefile</affectedPath><affectedPath>package/boot/uboot-mediatek/patches/009-tools-mtk_image-honour-SOURCE_DATE_EPOCH.patch</affectedPath><commitId>03ffe29cdf03b3824a621a63c098ac7e477282a0</commitId><timestamp>1790095590000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>uboot-mediatek: use a reproducible build timestamp for MT7621

mtk_image_set_mt7621_header() reads the wall clock and writes it to the
timestamp of the legacy image header, so the MT7621 boot loader image
differs on every build.

Add a patch that uses imagetool_get_source_date(), which the other image
tools already use, and keep the wall clock as the fallback.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:46:30 +0200</date><id>03ffe29cdf03b3824a621a63c098ac7e477282a0</id><msg>uboot-mediatek: use a reproducible build timestamp for MT7621</msg><path><editType>edit</editType><file>package/boot/uboot-mediatek/Makefile</file></path><path><editType>add</editType><file>package/boot/uboot-mediatek/patches/009-tools-mtk_image-honour-SOURCE_DATE_EPOCH.patch</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/bmips/image/Makefile</affectedPath><commitId>f73a0d39e172402e42bce02e62592280fc96f806</commitId><timestamp>1790095590000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>bmips: squash the owner and the mode in the CFE JFFS2 partition

Build/cfe-jffs2 is the only mkfs.jffs2 call in the tree that passes
neither --squash-uids nor --squash-perms. The recipe creates the marker
files with touch and cp, so the JFFS2 inodes carry the uid, the gid and
the umask of the build machine. The published images hold uid and gid
1000.

mkfs.jffs2 already takes the timestamp from SOURCE_DATE_EPOCH, so the
owner and the mode are the remaining inputs from the environment.

Pass both options, as mvebu and ath79 already do.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:46:30 +0200</date><id>f73a0d39e172402e42bce02e62592280fc96f806</id><msg>bmips: squash the owner and the mode in the CFE JFFS2 partition</msg><path><editType>edit</editType><file>target/linux/bmips/image/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/imx/image/cortexa9.mk</affectedPath><commitId>fc166c4869dba4876ad3d7d6e12a8ff87c35ca2a</commitId><timestamp>1790095590000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>imx: fix the boot file system of the Gateworks Ventana

Build/boot-overlay copies the device trees and builds the boot script in
$@.boot, so every file carries the build time. mkfs.ubifs writes st_mtime
straight into the inode and has no SOURCE_DATE_EPOCH support, and the two
tar calls pass neither --sort=name nor the options that pin the owner and
the mode, so both nand.ubi and bootfs.tar.gz differ between builds.

The diffoscope of the published bootfs.tar.gz shows both: wall clock
mtimes on the device tree files, and a member order that follows readdir.

Set the times in $@.boot once, before the UBIFS image and the tar are
made. Sort the members of both archives and give them a fixed owner and
mode, as the other archive recipes do.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:46:30 +0200</date><id>fc166c4869dba4876ad3d7d6e12a8ff87c35ca2a</id><msg>imx: fix the boot file system of the Gateworks Ventana</msg><path><editType>edit</editType><file>target/linux/imx/image/cortexa9.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/kernel/lantiq/ltq-tapi/patches/021-keep-build-paths-out-of-the-configure-string.patch</affectedPath><affectedPath>package/kernel/lantiq/ltq-tapi/Makefile</affectedPath><affectedPath>package/kernel/lantiq/ltq-vmmc/patches/022-keep-build-paths-out-of-the-configure-string.patch</affectedPath><affectedPath>package/kernel/lantiq/ltq-vmmc/Makefile</affectedPath><commitId>661d6963dfed41b291be3bcb98523d44ce7a872c</commitId><timestamp>1790095590000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>lantiq: keep build paths out of the TAPI and VMMC modules

configure.in of drv_tapi and drv_vmmc compiles the whole configure command
line into the module. drv_tapi_linux.c prints it through a proc file. The
command line holds the absolute paths of the build machine, among them
--enable-kernelbuild, --with-ifxos-incl, --enable-tapiincl, CPPFLAGS and
LDFLAGS, so the module depends on the directory it was built in.

Measured in the published snapshot modules of lantiq/xway: drv_tapi.ko and
drv_vmmc.ko both hold
--enable-kernelbuild=/builder/shared-workdir/build/build_dir/...
The existing 020-not-leak-cflags.patch covers the Kbuild CFLAGS, not this
string.

Drop every argument that holds a path and keep the feature flags. The loop
repeats the idiom the file already uses for CONFIGURE_OPTIONS.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:46:30 +0200</date><id>661d6963dfed41b291be3bcb98523d44ce7a872c</id><msg>lantiq: keep build paths out of the TAPI and VMMC modules</msg><path><editType>add</editType><file>package/kernel/lantiq/ltq-tapi/patches/021-keep-build-paths-out-of-the-configure-string.patch</file></path><path><editType>edit</editType><file>package/kernel/lantiq/ltq-vmmc/Makefile</file></path><path><editType>add</editType><file>package/kernel/lantiq/ltq-vmmc/patches/022-keep-build-paths-out-of-the-configure-string.patch</file></path><path><editType>edit</editType><file>package/kernel/lantiq/ltq-tapi/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>scripts/make-sbom.py</affectedPath><affectedPath>scripts/package-metadata.pl</affectedPath><commitId>712ff7ca89f76f6fdcb3289f78b7176174013a1e</commitId><timestamp>1790095590000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: create reproducible CycloneDX SBOMs

Both SBOM generators produce a different file on every run, so the
published .bom.cdx.json of an image and of a package feed never match a
rebuild.

dump_cyclonedxsbom_json() in scripts/package-metadata.pl has three
causes. It draws the serial number from rand(), it takes the timestamp
from the wall clock, and encode_json() follows the Perl hash order, which
changes with the hash seed of each run. The last one alone reorders every
key in the file.

scripts/make-sbom.py has the first two causes, through uuid.uuid4() and
datetime.utcnow().

Take the timestamp from SOURCE_DATE_EPOCH, which the build exports. Derive
the serial number from the timestamp and the component list, so it stays a
valid RFC 4122 identifier and still changes when the content changes. Sort
the keys of the Perl output.

Tested with the package index and the image manifest of an ipq40xx build.
Two runs with the same SOURCE_DATE_EPOCH are now identical, two runs with
different values differ, and the scripts exit with an error when the value
is not a number. Both files differ between two runs without the change.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:46:30 +0200</date><id>712ff7ca89f76f6fdcb3289f78b7176174013a1e</id><msg>build: create reproducible CycloneDX SBOMs</msg><path><editType>edit</editType><file>scripts/package-metadata.pl</file></path><path><editType>edit</editType><file>scripts/make-sbom.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/kernel.mk</affectedPath><affectedPath>include/package.mk</affectedPath><affectedPath>rules.mk</affectedPath><commitId>b06e5f3bf9246d5d299142f5a774497f07b8ec2d</commitId><timestamp>1790095590000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: map the staging directory out of the compiler output

iremap is called with BUILD_DIR and with PKG_BUILD_DIR, never with
STAGING_DIR. A header taken from the staging directory therefore reaches
__FILE__ and the debug information with its absolute path, and the result
depends on the directory the tree was built in.

Measured in the published snapshot of lantiq/xway: mt76-connac-lib.ko,
mt76x02-lib.ko and mt7925-common.ko hold
/builder/shared-workdir/build/staging_dir/target-mips_24kc_musl/usr/include/mac80211/net/cfg80211.h
That path is __FILE__ in .rodata, so the strip before the package is built
cannot reach it and the module ships it.

Map STAGING_DIR as well. Keep the staging_dir element in the replacement:
the last element of STAGING_DIR and of BUILD_DIR carry the same name, so
the bare name would make the two roots indistinguishable. The map of
BUILD_DIR does not change, so only a path that leaks today changes.

Verified with the target compiler on a header below a mapped directory:
-ffile-prefix-map removes the absolute path from both __FILE__ and the
debug information, -fmacro-prefix-map removes it from __FILE__ alone. The
shipped half is __FILE__, so both variants cover it.

A local build of mt76 also holds nine staging paths, but those are debug
information: the build directory copy of mt76-connac-lib.ko is 653456
bytes with 13 debug sections and nine such paths, the shipped copy is
84688 bytes with none. They are named here so that the next reader does
not take them for the same defect.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:46:30 +0200</date><id>b06e5f3bf9246d5d299142f5a774497f07b8ec2d</id><msg>build: map the staging directory out of the compiler output</msg><path><editType>edit</editType><file>include/kernel.mk</file></path><path><editType>edit</editType><file>include/package.mk</file></path><path><editType>edit</editType><file>rules.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>toolchain/gcc/common.mk</affectedPath><commitId>fa081cadb824d6b104386471eaecb217b665a9a9</commitId><timestamp>1790095590000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>toolchain: keep the build path out of the target libraries

gcc builds the target libraries with CFLAGS_FOR_TARGET, which carries no
prefix map. __FILE__ therefore expands to an absolute path, and assert in
libstdc++ and the ryu code put seven of them into .rodata, where the strip
before packaging cannot reach them. The libstdcpp6 package differs between
two builds in different directories, and so does every image that ships it.

The published package shows the same thing. libstdcpp6-14.4.0-r5.apk of
bcm47xx/mips74k holds
/builder/shared-workdir/build/build_dir/toolchain-mipsel_74kc_gcc-14.4.0_musl/gcc-14.4.0/libstdc++-v3/src/c++11/debug.cc
so no rebuild of that package can match today.

iremap is called with BUILD_DIR for the kernel, with PKG_BUILD_DIR for a
package and with STAGING_DIR for the target headers. The toolchain build
directory has no such call. Add one for the three FOR_TARGET flag sets.

The replacement keeps the build_dir element, because the last element of
the toolchain build directory and of the toolchain staging directory is
the same string and one replacement for both would make the two roots
indistinguishable.

Tested with two bcm47xx/mips74k trees whose directory names differ in
length. The shipped libstdc++.so.6.0.33 holds no absolute path any more
and the libstdcpp6 package is now identical in both trees. It differed by
165 bytes before.

The toolchain staging directory still appears in the debug information of
the same library, 244 times. Those are DWARF include directories, they do
not survive the strip, and no shipped file carries them.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:46:30 +0200</date><id>fa081cadb824d6b104386471eaecb217b665a9a9</id><msg>toolchain: keep the build path out of the target libraries</msg><path><editType>edit</editType><file>toolchain/gcc/common.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/boot/uboot-lantiq/Makefile</affectedPath><affectedPath>package/boot/uboot-lantiq/patches/201-Makefile-honour-SOURCE_DATE_EPOCH.patch</affectedPath><commitId>b1aa81b442ba95273304ff9d060775b3617c37cf</commitId><timestamp>1790095590000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>uboot-lantiq: use a reproducible build timestamp

u-boot 2013.10 builds timestamp_autogenerated.h with a bare date call, so
U_BOOT_DATE and U_BOOT_TIME hold the wall clock and the banner of every
image changes on each build:

  U-Boot 2013.10-openwrt4 (Sep 21 2026 - 20:47:50) ARV7506PW11

Add a patch that uses SOURCE_DATE_EPOCH when the environment provides it,
which the build already exports, and keeps the wall clock otherwise. Later
u-boot versions do the same in their own timestamp rule, which is why only
this package needs the change.

Found with two lantiq/xway trees whose directory names differ in length.
Three bytes of u-boot.bin differed, all inside the banner. After the
change the three u-boot images of arv7506pw11 are identical in both trees
and the banner follows the source date.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:46:30 +0200</date><id>b1aa81b442ba95273304ff9d060775b3617c37cf</id><msg>uboot-lantiq: use a reproducible build timestamp</msg><path><editType>edit</editType><file>package/boot/uboot-lantiq/Makefile</file></path><path><editType>add</editType><file>package/boot/uboot-lantiq/patches/201-Makefile-honour-SOURCE_DATE_EPOCH.patch</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/kernel-defaults.mk</affectedPath><affectedPath>include/rootfs.mk</affectedPath><commitId>3a16a57c08e9b6dcfcccf9a5eb611c79eadff2c9</commitId><timestamp>1790095590000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>kernel: keep /init out of the root filesystem images

The initramfs step copied /init into the root filesystem directory and
never removed it again. With CONFIG_TARGET_PER_DEVICE_ROOTFS the
initramfs kernel and the rootfs image of a device come from that same
directory. Nothing orders the two steps, so /init entered the squashfs
image or not, depending on which step ran first. The reproducible build
service reports this as a difference between the published image and a
rebuild.

Add /init to the initramfs from outside the root filesystem instead. A
built in initramfs gets it through a gen_init_cpio list file. A separate
cpio gets it appended to the finished archive. The mode is now fixed at
0755 and no longer follows the umask of the checkout.

The initramfs step also normalised the mtime of the root filesystem
directory. Do that in prepare_rootfs, so no step writes to the directory
after the image build can start.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 18:46:30 +0200</date><id>3a16a57c08e9b6dcfcccf9a5eb611c79eadff2c9</id><msg>kernel: keep /init out of the root filesystem images</msg><path><editType>edit</editType><file>include/kernel-defaults.mk</file></path><path><editType>edit</editType><file>include/rootfs.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/boot/arm-trusted-firmware-microchipsw/Makefile</affectedPath><commitId>d15fd263f7214f9b71121039f871cb94ae4f9ced</commitId><timestamp>1790098675000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName></author><authorEmail>robimarko@gmail.com</authorEmail><comment>boot: arm-trusted-firmware-microchipsw: update to v2.8.17-mchp4

Microchip has fixed various issues since the last update, so update TF-A.

Signed-off-by: Robert Marko &lt;robert.marko@sartura.hr&gt;
</comment><date>2026-09-22 19:37:55 +0200</date><id>d15fd263f7214f9b71121039f871cb94ae4f9ced</id><msg>boot: arm-trusted-firmware-microchipsw: update to v2.8.17-mchp4</msg><path><editType>edit</editType><file>package/boot/arm-trusted-firmware-microchipsw/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/boot/arm-trusted-firmware-microchipsw/patches/0004-plat-microchip-convert-FWU-scripts-to-Python.patch</affectedPath><affectedPath>package/boot/arm-trusted-firmware-microchipsw/Makefile</affectedPath><affectedPath>package/boot/arm-trusted-firmware-microchipsw/patches/0004-microchip-lan969x-do-not-rely-on-Ruby-shebang.patch</affectedPath><commitId>b24e4338646f62c6dd8d138d41ced466362911cf</commitId><timestamp>1790098675000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName></author><authorEmail>robimarko@gmail.com</authorEmail><comment>boot: arm-trusted-firmware-microchipsw: convert FWU scripts to Python

Currently, we depend on building the host Ruby support just for the two
FWU scripts that are written in Ruby.

Use Codex 5.6 to convert the scripts to Python and drop Ruby dependency.

Signed-off-by: Robert Marko &lt;robert.marko@sartura.hr&gt;
</comment><date>2026-09-22 19:37:55 +0200</date><id>b24e4338646f62c6dd8d138d41ced466362911cf</id><msg>boot: arm-trusted-firmware-microchipsw: convert FWU scripts to Python</msg><path><editType>add</editType><file>package/boot/arm-trusted-firmware-microchipsw/patches/0004-plat-microchip-convert-FWU-scripts-to-Python.patch</file></path><path><editType>edit</editType><file>package/boot/arm-trusted-firmware-microchipsw/Makefile</file></path><path><editType>delete</editType><file>package/boot/arm-trusted-firmware-microchipsw/patches/0004-microchip-lan969x-do-not-rely-on-Ruby-shebang.patch</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/system/procd/Makefile</affectedPath><affectedPath>package/system/procd/files/uxc.sh</affectedPath><commitId>56d9cd66a8ec84989618f3fea76e429c2d2eeda5</commitId><timestamp>1790100067000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/daniel</absoluteUrl><fullName>daniel</fullName></author><authorEmail>daniel@makrotopia.org</authorEmail><comment>procd: update to git HEAD of 2026-09-22

Various bug fixes and container runtime improvements.

Fixes: #25277 (at least)
Signed-off-by: Daniel Golle &lt;daniel@makrotopia.org&gt;
</comment><date>2026-09-22 19:01:07 +0100</date><id>56d9cd66a8ec84989618f3fea76e429c2d2eeda5</id><msg>procd: update to git HEAD of 2026-09-22</msg><path><editType>edit</editType><file>package/system/procd/files/uxc.sh</file></path><path><editType>edit</editType><file>package/system/procd/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tools/lzma/Makefile</affectedPath><affectedPath>tools/mkimage/Makefile</affectedPath><affectedPath>tools/mtools/Makefile</affectedPath><commitId>0f05c481fd445d49fdea6962952a84d53d03da1c</commitId><timestamp>1790101799000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>tools: pass the job server to the compile step of mtools, mkimage and lzma

host-build.mk clears MAKEFLAGS, so a custom Host/Compile that runs a bare
$(MAKE) builds with one job, whatever HOST_BUILD_PARALLEL says. mtools
sets the flag, but its compile step never used it.

Each of the three now passes $(HOST_JOBS), and mkimage and lzma set
HOST_BUILD_PARALLEL:

  mkimage  11.7 s -&gt; 7.2 s
  mtools    8.3 s -&gt; 4.8 s
  lzma      4.0 s -&gt; 1.8 s

Each one builds five times out of five with the job server, and each
build installs files that are identical to those of a serial build.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 20:29:59 +0200</date><id>0f05c481fd445d49fdea6962952a84d53d03da1c</id><msg>tools: pass the job server to the compile step of mtools, mkimage and lzma</msg><path><editType>edit</editType><file>tools/mtools/Makefile</file></path><path><editType>edit</editType><file>tools/mkimage/Makefile</file></path><path><editType>edit</editType><file>tools/lzma/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tools/make-ext4fs/Makefile</affectedPath><affectedPath>tools/automake/Makefile</affectedPath><affectedPath>tools/dosfstools/Makefile</affectedPath><affectedPath>tools/libtool/Makefile</affectedPath><affectedPath>tools/autoconf/Makefile</affectedPath><commitId>c3447b76fe2c76e1eedf4fca0a8955a8cb568677</commitId><timestamp>1790101799000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>tools: build autoconf, automake, libtool, dosfstools and make-ext4fs in parallel

  libtool      22.5 s -&gt; 20.0 s
  dosfstools    6.0 s -&gt;  4.8 s
  make-ext4fs   2.1 s -&gt;  1.2 s
  automake      3.9 s -&gt;  3.4 s
  autoconf      3.1 s -&gt;  2.6 s

Each one builds five times out of five with the job server, and each
build installs files that are identical to those of a serial build.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 20:29:59 +0200</date><id>c3447b76fe2c76e1eedf4fca0a8955a8cb568677</id><msg>tools: build autoconf, automake, libtool, dosfstools and make-ext4fs in parallel</msg><path><editType>edit</editType><file>tools/automake/Makefile</file></path><path><editType>edit</editType><file>tools/dosfstools/Makefile</file></path><path><editType>edit</editType><file>tools/libtool/Makefile</file></path><path><editType>edit</editType><file>tools/autoconf/Makefile</file></path><path><editType>edit</editType><file>tools/make-ext4fs/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tools/sparse/Makefile</affectedPath><commitId>37f7186e75b0af0a1338fd6625f3f3881c2fce01</commitId><timestamp>1790101799000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>tools/sparse: build in parallel

sparse set PKG_BUILD_PARALLEL, which a host build does not read, so it
built with one job. Use HOST_BUILD_PARALLEL: 6.6 s -&gt; 1.3 s.

It builds five times out of five with the job server, and each build
installs files that are identical to those of a serial build.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 20:29:59 +0200</date><id>37f7186e75b0af0a1338fd6625f3f3881c2fce01</id><msg>tools/sparse: build in parallel</msg><path><editType>edit</editType><file>tools/sparse/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/site/cache</affectedPath><affectedPath>rules.mk</affectedPath><commitId>18a2ea702cf3111a21deed641f946d31f4e09018</commitId><timestamp>1790101799000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>build: start the configure cache cold when its answers may be stale

Three cases kept a cached answer that no longer held:

A new configure script. A package with an autoreconf fixup regenerates
configure with the staged autoconf, automake and libtool, and a new
version of one of them can change what a cache variable means. The site
script now keeps a checksum of configure beside the cache and drops the
cache when the checksum changes. A new patch to configure is covered too.

A changed precious variable. configure aborts when LIBS, CPP or another
precious variable differs from the value in the cache, and because
nothing removes the cache, it aborts on every later run as well:

  configure: error: 'LIBS' was not set in the previous run
  configure: error: changes in the environment can compromise the build

The site script now makes the same comparison before configure does and
drops the cache on a difference.

Paths under other names. The libtool answers lt_cv_path_*, acl_cv_path_*
and lt_cv_sys_global_symbol_*, and gmp_cv_prog_m4, hold the path of a
system tool or of the staged sed and m4, and survived a wipe of
staging_dir. The site script now drops them with the ac_cv_path_ answers.

m4 and gmp still configure the same way with a warm cache as they do
without one, and still read it: the m4 configure stage takes 1.5 s warm
against 23 s cold.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 20:29:59 +0200</date><id>18a2ea702cf3111a21deed641f946d31f4e09018</id><msg>build: start the configure cache cold when its answers may be stale</msg><path><editType>edit</editType><file>rules.mk</file></path><path><editType>edit</editType><file>include/site/cache</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tools/bc/Makefile</affectedPath><affectedPath>tools/expat/Makefile</affectedPath><affectedPath>tools/mtools/Makefile</affectedPath><affectedPath>tools/flex/Makefile</affectedPath><affectedPath>tools/xz/Makefile</affectedPath><affectedPath>tools/libressl/Makefile</affectedPath><affectedPath>tools/libtool/Makefile</affectedPath><affectedPath>tools/fakeroot/Makefile</affectedPath><affectedPath>tools/gengetopt/Makefile</affectedPath><affectedPath>tools/mtd-utils/Makefile</affectedPath><affectedPath>tools/dosfstools/Makefile</affectedPath><commitId>6eae1d6b772eeb012046f64be83ecf9ea5ef7514</commitId><timestamp>1790101799000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName></author><authorEmail>john@phrozen.org</authorEmail><comment>tools: cache the configure results of eleven more autotools tools

Configure stage without a cache against a warm cache:

  mtools      3.34 s -&gt; 0.28 s
  gengetopt   4.39 s -&gt; 2.13 s
  fakeroot   10.97 s -&gt; 8.73 s
  xz          4.32 s -&gt; 2.17 s
  libressl    3.07 s -&gt; 1.46 s
  flex       12.32 s -&gt; 10.98 s
  expat       2.74 s -&gt; 1.52 s
  bc          1.34 s -&gt; 0.38 s
  dosfstools  3.13 s -&gt; 2.54 s
  libtool     2.86 s -&gt; 2.29 s
  mtd-utils   4.06 s -&gt; 3.56 s

flex, fakeroot, dosfstools and mtd-utils run autoreconf in the same
stage, and the cache does not reach that part.

Each of the eleven configures the same way with a warm cache as it does
without one: the check configures three times, without a cache, with a
cold cache and with a warm cache, and every generated file of the first
and the last run is identical. A static scan of each configure script
found no cache check that changes CFLAGS, CPPFLAGS, LDFLAGS or LIBS
without restoring it.

patchelf, mklibs and automake pass the same check but gain less than
half a second, so they stay out.

make world after make tools/clean now takes 121 s against 177 s with
cold caches.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</comment><date>2026-09-22 20:29:59 +0200</date><id>6eae1d6b772eeb012046f64be83ecf9ea5ef7514</id><msg>tools: cache the configure results of eleven more autotools tools</msg><path><editType>edit</editType><file>tools/flex/Makefile</file></path><path><editType>edit</editType><file>tools/expat/Makefile</file></path><path><editType>edit</editType><file>tools/xz/Makefile</file></path><path><editType>edit</editType><file>tools/fakeroot/Makefile</file></path><path><editType>edit</editType><file>tools/mtd-utils/Makefile</file></path><path><editType>edit</editType><file>tools/gengetopt/Makefile</file></path><path><editType>edit</editType><file>tools/libressl/Makefile</file></path><path><editType>edit</editType><file>tools/dosfstools/Makefile</file></path><path><editType>edit</editType><file>tools/libtool/Makefile</file></path><path><editType>edit</editType><file>tools/bc/Makefile</file></path><path><editType>edit</editType><file>tools/mtools/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/generic/pending-6.18/304-LoongArch-vdso-keep-the-prefix-map-flags.patch</affectedPath><affectedPath>target/linux/generic/pending-6.12/304-LoongArch-vdso-keep-the-prefix-map-flags.patch</affectedPath><commitId>67fcd3e5698a2dbf3d71068fce2dcfacc3a3109d</commitId><timestamp>1790106068000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/jonas</absoluteUrl><fullName>jonas</fullName></author><authorEmail>jonas@jonasjelonek.de</authorEmail><comment>generic: refresh the LoongArch vDSO prefix map patch

The patch ends in an empty line where quilt writes a context line
holding a single space, so `make target/linux/refresh` rewrites it
and the kernel patch check fails on every target.

Fixes: 115209aa225a ("kernel: make the LoongArch vDSO build id independent of the build path")
Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Julius Bairaktaris &lt;julius@bairaktaris.de&gt;
Link: https://github.com/openwrt/openwrt/pull/25333
Signed-off-by: Jonas Jelonek &lt;jonas@jonasjelonek.de&gt;
</comment><date>2026-09-22 21:41:08 +0200</date><id>67fcd3e5698a2dbf3d71068fce2dcfacc3a3109d</id><msg>generic: refresh the LoongArch vDSO prefix map patch</msg><path><editType>edit</editType><file>target/linux/generic/pending-6.18/304-LoongArch-vdso-keep-the-prefix-map-flags.patch</file></path><path><editType>edit</editType><file>target/linux/generic/pending-6.12/304-LoongArch-vdso-keep-the-prefix-map-flags.patch</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/ath79/image/generic.mk</affectedPath><affectedPath>target/linux/ath79/generic/config-default</affectedPath><commitId>2e5345462eeb203b54d2805b388cae271041b8a5</commitId><timestamp>1790109688000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/jonas</absoluteUrl><fullName>jonas</fullName></author><authorEmail>jonas@jonasjelonek.de</authorEmail><comment>ath79: use module for Fritz 300E

The generic config builds CONFIG_INTEL_XWAY_PHY for all devices while
only a single one uses it. Avoid bloating the kernel by using the module
for the only device that uses this PHY.

Signed-off-by: Rosen Penev &lt;rosenp@gmail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/25294
Signed-off-by: Jonas Jelonek &lt;jonas@jonasjelonek.de&gt;
</comment><date>2026-09-22 22:41:28 +0200</date><id>2e5345462eeb203b54d2805b388cae271041b8a5</id><msg>ath79: use module for Fritz 300E</msg><path><editType>edit</editType><file>target/linux/ath79/generic/config-default</file></path><path><editType>edit</editType><file>target/linux/ath79/image/generic.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/ath79/dts/qca9558_tplink_archer-c.dtsi</affectedPath><affectedPath>target/linux/ath79/generic/base-files/etc/board.d/02_network</affectedPath><affectedPath>target/linux/ath79/generic/base-files/etc/board.d/05_compat-version</affectedPath><affectedPath>target/linux/ath79/image/generic-tp-link.mk</affectedPath><commitId>7d1c5a68e534652378cd14e2ef8f9732567a2a69</commitId><timestamp>1790109798000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/jonas</absoluteUrl><fullName>jonas</fullName></author><authorEmail>jonas@jonasjelonek.de</authorEmail><comment>ath79: convert qca9558_tplink_archer-c.dtsi to swconfig

This reverts commit 487ff3cfa03771102c18a987acd83f8ea020e5e3.

Three problems:

CONFIG_AR8216_PHY is enabled and to stop it from interfering and
crashing on boot, internal MDIO needs to be used.

Once internal MDIO gets used, ports end up dying even in the absence of
traffic. This is currently believed to be an issue with qca,qca8327
specifically. There are no reports of qca,qca8337 behaving badly.

Routing speed with DSA becomes much slower. Gigabit routing is no longer
doable, even with flow offload. This needs further research.

Signed-off-by: Rosen Penev &lt;rosenp@gmail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/25308
Signed-off-by: Jonas Jelonek &lt;jonas@jonasjelonek.de&gt;
</comment><date>2026-09-22 22:43:18 +0200</date><id>7d1c5a68e534652378cd14e2ef8f9732567a2a69</id><msg>ath79: convert qca9558_tplink_archer-c.dtsi to swconfig</msg><path><editType>edit</editType><file>target/linux/ath79/generic/base-files/etc/board.d/02_network</file></path><path><editType>edit</editType><file>target/linux/ath79/dts/qca9558_tplink_archer-c.dtsi</file></path><path><editType>delete</editType><file>target/linux/ath79/generic/base-files/etc/board.d/05_compat-version</file></path><path><editType>edit</editType><file>target/linux/ath79/image/generic-tp-link.mk</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/network/utils/comgt/Makefile</affectedPath><affectedPath>package/network/utils/comgt/files/ncm.json</affectedPath><commitId>19ff245b9233060bcbf55ec50cc3086d4348b72c</commitId><timestamp>1790111268000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/jonas</absoluteUrl><fullName>jonas</fullName></author><authorEmail>jonas@jonasjelonek.de</authorEmail><comment>comgt: add ncm support for Fibocom FG621-EA modem

Add a vendor profile for Fibocom modems so that proto ncm can drive them.
Without it ncm.sh reports UNSUPPORTED_MODEM, as the manufacturer string
returned by AT+CGMI has no matching key in ncm.json.

The FG621-EA is used in the ASUS 4G-AX56 and the TP-Link TL-MR500 v1. The
profile keys off the manufacturer string rather than any particular board,
so it applies to Fibocom NCM modems generally.

ncm.json is installed by comgt-ncm, so bump PKG_RELEASE to make sure
existing installations pick up the new vendor profile on upgrade.

This change originates from PR #19793 by kddred, open in draft since
August 2025 without review. The original commit is authored and signed
off with a GitHub noreply address, which the commit formality check
rejects, so it could not be carried unmodified, and kddred has not been
active since August 2025. Authorship is reassigned for that reason alone;
the work is theirs. Happy to restore the original authorship if a usable
address becomes available.

Tested on an ASUS 4G-AX56 (HW rev A1) on both main and openwrt-25.12.

Link: https://github.com/openwrt/openwrt/pull/19793
Signed-off-by: Fredrik Hallin &lt;fredappsdev@outlook.com&gt;
Link: https://github.com/openwrt/openwrt/pull/24974
Signed-off-by: Jonas Jelonek &lt;jonas@jonasjelonek.de&gt;
</comment><date>2026-09-22 23:07:48 +0200</date><id>19ff245b9233060bcbf55ec50cc3086d4348b72c</id><msg>comgt: add ncm support for Fibocom FG621-EA modem</msg><path><editType>edit</editType><file>package/network/utils/comgt/files/ncm.json</file></path><path><editType>edit</editType><file>package/network/utils/comgt/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/patches-6.18/040-v7.4-spi-realtek-rtl-add-support-for-second-CS.patch</affectedPath><commitId>c09e3f28ba110394a1aa4b765d73a4b53e7c90b6</commitId><timestamp>1790149366000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/jonas</absoluteUrl><fullName>jonas</fullName></author><authorEmail>jonas@jonasjelonek.de</authorEmail><comment>realtek: spi: backport patch to support second SPI CS

Backports an accepted upstream patch targeted for 7.4 to extend the
Realtek SPI driver with support for the second CS. Though no devices
made use of this so far, further devices may do so.

Link: https://github.com/openwrt/openwrt/pull/25334
Signed-off-by: Jonas Jelonek &lt;jonas@jonasjelonek.de&gt;
</comment><date>2026-09-23 09:42:46 +0200</date><id>c09e3f28ba110394a1aa4b765d73a4b53e7c90b6</id><msg>realtek: spi: backport patch to support second SPI CS</msg><path><editType>add</editType><file>target/linux/realtek/patches-6.18/040-v7.4-spi-realtek-rtl-add-support-for-second-CS.patch</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tools/yafut/patches/100-honour-SOURCE_DATE_EPOCH.patch</affectedPath><commitId>d5c26afe3336e6a2602f3f90e62dff5f4ec81b84</commitId><timestamp>1790157519000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/nbd</absoluteUrl><fullName>nbd</fullName></author><authorEmail>nbd@nbd.name</authorEmail><comment>tools/yafut: refresh patch

Refresh 100-honour-SOURCE_DATE_EPOCH.patch

Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</comment><date>2026-09-23 11:58:39 +0200</date><id>d5c26afe3336e6a2602f3f90e62dff5f4ec81b84</id><msg>tools/yafut: refresh patch</msg><path><editType>edit</editType><file>tools/yafut/patches/100-honour-SOURCE_DATE_EPOCH.patch</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/qualcommax/dts/ipq6018-mr7500.dts</affectedPath><commitId>fa6c94b6e963e5c043da208eb9661240fe346593</commitId><timestamp>1790163445000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName></author><authorEmail>robimarko@gmail.com</authorEmail><comment>qualcommax: ipq60xx: add AQR114C reset delays for MR7500

The AQR114C requires time after reset deassertion before it is
ready to respond on the MDIO bus. Add reset-assert-us and
reset-deassert-us to ensure reliable PHY enumeration on boot.

Signed-off-by: Ross Barnes-Brown &lt;true.robot.ross@gmail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/24055
Signed-off-by: Robert Marko &lt;robimarko@gmail.com&gt;
</comment><date>2026-09-23 13:37:25 +0200</date><id>fa6c94b6e963e5c043da208eb9661240fe346593</id><msg>qualcommax: ipq60xx: add AQR114C reset delays for MR7500</msg><path><editType>edit</editType><file>target/linux/qualcommax/dts/ipq6018-mr7500.dts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/boot/uboot-microchipsw/patches/0007-mmc-atmel-sdhci-add-support-for-LAN969x.patch</affectedPath><affectedPath>package/boot/uboot-microchipsw/src/board/microchip/lan969x/lan969x.env</affectedPath><affectedPath>package/boot/uboot-microchipsw/patches/0002-pinctrl-add-Microchip-LAN969x-driver.patch</affectedPath><affectedPath>package/boot/uboot-microchipsw/patches/0013-net-phy-add-Microchip-LAN8841-support.patch</affectedPath><affectedPath>package/boot/uboot-microchipsw/patches/0008-i2c-at91-i2c-include-arch-specific-clk.h-only-for-AT.patch</affectedPath><affectedPath>package/boot/uboot-microchipsw/patches/0010-usb-dwc3-generic-add-support-for-Microchip-LAN969x.patch</affectedPath><affectedPath>package/boot/uboot-microchipsw/patches/0006-mmc-atmel-sdhci-include-arch-specific-clk.h-only-for.patch</affectedPath><affectedPath>package/boot/uboot-microchipsw/patches/0003-clk-add-Microchip-LAN966x-and-LAN969x-support.patch</affectedPath><affectedPath>package/boot/uboot-microchipsw/patches/0011-spi-atmel-quadspi-add-Microchip-LAN969x-support.patch</affectedPath><affectedPath>package/boot/uboot-microchipsw/patches/0017-cmd-add-imsz-and-imszb.patch</affectedPath><affectedPath>package/boot/uboot-microchipsw/patches/200-cmd-add-imsz-and-imszb.patch</affectedPath><affectedPath>package/boot/uboot-microchipsw/patches/0005-mmc-atmel-sdhci-set-GCK-rate-based-on-compatible.patch</affectedPath><affectedPath>package/boot/uboot-microchipsw/patches/0004-mmc-atmel-remove-duplicate-depends-on-ARCH_AT91.patch</affectedPath><affectedPath>package/boot/uboot-microchipsw/patches/0014-arch-arm-add-Microchip-LAN969x-support.patch</affectedPath><affectedPath>package/boot/uboot-microchipsw/patches/0016-microchip-lan969x-add-OpenWrt-default-environment.patch</affectedPath><affectedPath>package/boot/uboot-microchipsw/patches/0012-net-add-Microchip-SparX-5-and-LAN969x-support.patch</affectedPath><affectedPath>package/boot/uboot-microchipsw/patches/0015-arm-microchipsw-add-Novarq-Tactical-1000.patch</affectedPath><affectedPath>package/boot/uboot-microchipsw/Makefile</affectedPath><affectedPath>package/boot/uboot-microchipsw/patches/0001-serial-atmel-usart-allow-selecting-from-ARCH_MICROCH.patch</affectedPath><affectedPath>package/boot/uboot-microchipsw/patches/0009-i2c-i2c-at91-allow-selecting-from-ARCH_MICROCHIPSW.patch</affectedPath><commitId>1f89cfd70159a3ff9ecf62fc5bcb3455abcba88c</commitId><timestamp>1790168948000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robert.marko</absoluteUrl><fullName>robert.marko</fullName></author><authorEmail>robert.marko@sartura.hr</authorEmail><comment>boot: uboot-microchipsw: use mainline U-Boot

Use mainline U-Boot with pending patches for LAN969x instead of the
old vendor U-Boot.

Both existing boards are supported.

Signed-off-by: Robert Marko &lt;robert.marko@sartura.hr&gt;
</comment><date>2026-09-23 15:09:08 +0200</date><id>1f89cfd70159a3ff9ecf62fc5bcb3455abcba88c</id><msg>boot: uboot-microchipsw: use mainline U-Boot</msg><path><editType>add</editType><file>package/boot/uboot-microchipsw/patches/0001-serial-atmel-usart-allow-selecting-from-ARCH_MICROCH.patch</file></path><path><editType>edit</editType><file>package/boot/uboot-microchipsw/Makefile</file></path><path><editType>add</editType><file>package/boot/uboot-microchipsw/patches/0006-mmc-atmel-sdhci-include-arch-specific-clk.h-only-for.patch</file></path><path><editType>add</editType><file>package/boot/uboot-microchipsw/patches/0015-arm-microchipsw-add-Novarq-Tactical-1000.patch</file></path><path><editType>add</editType><file>package/boot/uboot-microchipsw/patches/0005-mmc-atmel-sdhci-set-GCK-rate-based-on-compatible.patch</file></path><path><editType>add</editType><file>package/boot/uboot-microchipsw/patches/0014-arch-arm-add-Microchip-LAN969x-support.patch</file></path><path><editType>delete</editType><file>package/boot/uboot-microchipsw/src/board/microchip/lan969x/lan969x.env</file></path><path><editType>add</editType><file>package/boot/uboot-microchipsw/patches/0011-spi-atmel-quadspi-add-Microchip-LAN969x-support.patch</file></path><path><editType>add</editType><file>package/boot/uboot-microchipsw/patches/0002-pinctrl-add-Microchip-LAN969x-driver.patch</file></path><path><editType>add</editType><file>package/boot/uboot-microchipsw/patches/0009-i2c-i2c-at91-allow-selecting-from-ARCH_MICROCHIPSW.patch</file></path><path><editType>add</editType><file>package/boot/uboot-microchipsw/patches/0003-clk-add-Microchip-LAN966x-and-LAN969x-support.patch</file></path><path><editType>add</editType><file>package/boot/uboot-microchipsw/patches/0008-i2c-at91-i2c-include-arch-specific-clk.h-only-for-AT.patch</file></path><path><editType>add</editType><file>package/boot/uboot-microchipsw/patches/0013-net-phy-add-Microchip-LAN8841-support.patch</file></path><path><editType>delete</editType><file>package/boot/uboot-microchipsw/patches/200-cmd-add-imsz-and-imszb.patch</file></path><path><editType>add</editType><file>package/boot/uboot-microchipsw/patches/0007-mmc-atmel-sdhci-add-support-for-LAN969x.patch</file></path><path><editType>add</editType><file>package/boot/uboot-microchipsw/patches/0016-microchip-lan969x-add-OpenWrt-default-environment.patch</file></path><path><editType>add</editType><file>package/boot/uboot-microchipsw/patches/0004-mmc-atmel-remove-duplicate-depends-on-ARCH_AT91.patch</file></path><path><editType>add</editType><file>package/boot/uboot-microchipsw/patches/0017-cmd-add-imsz-and-imszb.patch</file></path><path><editType>add</editType><file>package/boot/uboot-microchipsw/patches/0010-usb-dwc3-generic-add-support-for-Microchip-LAN969x.patch</file></path><path><editType>add</editType><file>package/boot/uboot-microchipsw/patches/0012-net-add-Microchip-SparX-5-and-LAN969x-support.patch</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tools/cmake/Makefile</affectedPath><affectedPath>tools/cmake/patches/150-zstd-libarchive.patch</affectedPath><commitId>ad71bfef7e5c1c4e1579f6469110babb7e973d9b</commitId><timestamp>1790169479000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName></author><authorEmail>robimarko@gmail.com</authorEmail><comment>tools/cmake: pass zstd paths to bootstrap

Instead of carrying a patch (150-zstd-libarchive.patch) that modifies
Utilities/cmlibarchive/CMakeLists.txt to enable pkg-config search for
zstd, pass explicit staging library and include paths (-DZSTD_INCLUDE_DIR
and -DZSTD_LIBRARY) directly to CMake's bootstrap script.

ZSTD_INCLUDE_DIR and ZSTD_LIBRARY are the cache variables CMake itself
sets when --system-zstd is not used, so pre-seeding them guarantees that
CMake always links against OpenWrt's staging libzstd without requiring
a patch.

Fixes: 0e3d51ccaedf ("tools/cmake: fix compilation with host libzstd-dev")
Suggested-by: Michael Pratt &lt;mcpratt@pm.me&gt;
Signed-off-by: Josef Schlehofer &lt;pepe.schlehofer@gmail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/24407
Signed-off-by: Robert Marko &lt;robimarko@gmail.com&gt;
</comment><date>2026-09-23 15:17:59 +0200</date><id>ad71bfef7e5c1c4e1579f6469110babb7e973d9b</id><msg>tools/cmake: pass zstd paths to bootstrap</msg><path><editType>edit</editType><file>tools/cmake/Makefile</file></path><path><editType>delete</editType><file>tools/cmake/patches/150-zstd-libarchive.patch</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>include/cmake.mk</affectedPath><affectedPath>tools/cmake/patches/100-no-testing.patch</affectedPath><affectedPath>tools/cmake/Makefile</affectedPath><commitId>ddb23f3a0223d1280bd674ea7fe4b1dedde22997</commitId><timestamp>1790173765000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName></author><authorEmail>robimarko@gmail.com</authorEmail><comment>tools/cmake: pass -DBUILD_TESTING=OFF to bootstrap

Instead of carrying 100-no-testing.patch, pass -DBUILD_TESTING=OFF
directly to CMake's bootstrap script. This avoids refreshing the patch
on every CMake update.

The patch also changed the default in the installed CTest.cmake module.
Preserve that behavior by passing -DBUILD_TESTING=OFF by default in
cmake.mk for target and host builds. Packages can override it via
CMAKE_OPTIONS or CMAKE_HOST_OPTIONS.

OpenWrt never runs CMake tests, so building them only wastes build time.

This replaces the patch introduced in 8af80e79bd5b ("tools/cmake:
update to 3.17.0").

Signed-off-by: Josef Schlehofer &lt;pepe.schlehofer@gmail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/24403
Signed-off-by: Robert Marko &lt;robimarko@gmail.com&gt;
</comment><date>2026-09-23 16:29:25 +0200</date><id>ddb23f3a0223d1280bd674ea7fe4b1dedde22997</id><msg>tools/cmake: pass -DBUILD_TESTING=OFF to bootstrap</msg><path><editType>edit</editType><file>include/cmake.mk</file></path><path><editType>delete</editType><file>tools/cmake/patches/100-no-testing.patch</file></path><path><editType>edit</editType><file>tools/cmake/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tools/cmake/Makefile</affectedPath><commitId>e4f2ae3b8d797395f4763cb6d225911795a992ec</commitId><timestamp>1790175463000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName></author><authorEmail>robimarko@gmail.com</authorEmail><comment>tools/cmake: pass testing option after bootstrap separator

Host/Configure/Default supplies the bootstrap "--" separator before
CMAKE_HOST_OPTIONS. Keep BUILD_TESTING with the CMake cache options so
it is passed after that separator, without introducing a second one.

Fixes: ddb23f3a0223d ("tools/cmake: pass -DBUILD_TESTING=OFF to bootstrap")
Signed-off-by: Robert Marko &lt;robimarko@gmail.com&gt;
</comment><date>2026-09-23 16:57:43 +0200</date><id>e4f2ae3b8d797395f4763cb6d225911795a992ec</id><msg>tools/cmake: pass testing option after bootstrap separator</msg><path><editType>edit</editType><file>tools/cmake/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/devel/valgrind/Makefile</affectedPath><commitId>da415b6a69ebd98a5a58cceb058dd8273475c6d7</commitId><timestamp>1790175721000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName></author><authorEmail>robimarko@gmail.com</authorEmail><comment>valgrind: fix ARMv7 detection on AArch64

The mvebu target enables CONFIG_CPU_V7 even for AArch64 subtargets,
which also causes CONFIG_arm_v7 to be set. This makes Valgrind use
the ARMv7 configure host triplet on AArch64, breaking the build.

Only apply the ARMv7 host override when ARCH is arm.

Signed-off-by: Tianling Shen &lt;cnsztl@immortalwrt.org&gt;
Link: https://github.com/openwrt/openwrt/pull/25346
Signed-off-by: Robert Marko &lt;robimarko@gmail.com&gt;
</comment><date>2026-09-23 17:02:01 +0200</date><id>da415b6a69ebd98a5a58cceb058dd8273475c6d7</id><msg>valgrind: fix ARMv7 detection on AArch64</msg><path><editType>edit</editType><file>package/devel/valgrind/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/patches-6.18/743-net-realtek-serdes-configuration.patch</affectedPath><affectedPath>target/linux/realtek/patches-6.18/024-02-v7.1-net-phy-realtek-add-RTL8224-pair-order-support.patch</affectedPath><affectedPath>target/linux/realtek/patches-6.18/024-04-v7.1-net-phy-realtek-add-RTL8224-polarity-support.patch</affectedPath><affectedPath>target/linux/realtek/patches-6.18/030-v7.2-net-phy-realtek-support-MDI-swapping-for-RTL8226-CG.patch</affectedPath><affectedPath>target/linux/generic/pending-6.18/743-net-phy-realtek-reset-RTL8261N-USXGMII-SerDes-on-lin.patch</affectedPath><affectedPath>target/linux/generic/pending-6.18/742-net-phy-realtek-add-5G-and-10G-PHY-support.patch</affectedPath><commitId>76da1ee259c5804e105c3f044fcf94833608b227</commitId><timestamp>1790184476000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/jonas</absoluteUrl><fullName>jonas</fullName></author><authorEmail>jonas@jonasjelonek.de</authorEmail><comment>generic: harden RTL826x PHY match, EEE and soft-reset

Require PKG_MODEL 0x8261 for RTL8261BE/N probe matching.  Extend
EEE disable in rtl826x_probe() to multi-G speeds for PHYs without
a device-tree node (e.g. SFP cage modules).  Wait the datasheet t7
minimum (150 ms) after MMD30 soft-reset before applying firmware
patches.

Fixes 10G link flapping on Spectrum SBE1V1K (RTL8261BE).

Also exercised on BPi-R4 with a ZYOPM SFP+ RTL8261BE module.

Tested-by: Andrew LaMarche &lt;andrewjlamarche@gmail.com&gt;
Link: https://forum.openwrt.org/t/spectrum-sbe1v1k-ipq9574-openwrt-support/245244/190

Signed-off-by: Daniel Pawlik &lt;pawlik.dan@gmail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/24887
Signed-off-by: Jonas Jelonek &lt;jonas@jonasjelonek.de&gt;
</comment><date>2026-09-23 19:27:56 +0200</date><id>76da1ee259c5804e105c3f044fcf94833608b227</id><msg>generic: harden RTL826x PHY match, EEE and soft-reset</msg><path><editType>edit</editType><file>target/linux/generic/pending-6.18/743-net-phy-realtek-reset-RTL8261N-USXGMII-SerDes-on-lin.patch</file></path><path><editType>edit</editType><file>target/linux/realtek/patches-6.18/743-net-realtek-serdes-configuration.patch</file></path><path><editType>edit</editType><file>target/linux/realtek/patches-6.18/024-02-v7.1-net-phy-realtek-add-RTL8224-pair-order-support.patch</file></path><path><editType>edit</editType><file>target/linux/realtek/patches-6.18/030-v7.2-net-phy-realtek-support-MDI-swapping-for-RTL8226-CG.patch</file></path><path><editType>edit</editType><file>target/linux/generic/pending-6.18/742-net-phy-realtek-add-5G-and-10G-PHY-support.patch</file></path><path><editType>edit</editType><file>target/linux/realtek/patches-6.18/024-04-v7.1-net-phy-realtek-add-RTL8224-polarity-support.patch</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c</affectedPath><commitId>cc83970a16200b453ae2363520151cad1e30ac9a</commitId><timestamp>1790184620000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/jonas</absoluteUrl><fullName>jonas</fullName></author><authorEmail>jonas@jonasjelonek.de</authorEmail><comment>realtek: pcs: rtl93xx: name common SerDes registers and fields

Document SerDes registers and fields shared by RTL930x and RTL931x.
Replace magic offsets and bit ranges at their call sites with the named
registers and field masks.

Link: https://github.com/openwrt/openwrt/pull/25314
Signed-off-by: Jonas Jelonek &lt;jonas@jonasjelonek.de&gt;
</comment><date>2026-09-23 19:30:20 +0200</date><id>cc83970a16200b453ae2363520151cad1e30ac9a</id><msg>realtek: pcs: rtl93xx: name common SerDes registers and fields</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c</affectedPath><commitId>be387779344c4cecaae5b3382945e7f67618f583</commitId><timestamp>1790184621000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/jonas</absoluteUrl><fullName>jonas</fullName></author><authorEmail>jonas@jonasjelonek.de</authorEmail><comment>realtek: pcs: rtl930x: name SerDes registers and fields

Document RTL930x SerDes registers and fields, then replace magic offsets
and bit ranges at their call sites. Use FIELD_PREP() where values need
positioning and named masks for field updates.

Link: https://github.com/openwrt/openwrt/pull/25314
Signed-off-by: Jonas Jelonek &lt;jonas@jonasjelonek.de&gt;
</comment><date>2026-09-23 19:30:21 +0200</date><id>be387779344c4cecaae5b3382945e7f67618f583</id><msg>realtek: pcs: rtl930x: name SerDes registers and fields</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c</affectedPath><commitId>c1b568dbd7b297120e9df587acc56847c37159a3</commitId><timestamp>1790184621000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/jonas</absoluteUrl><fullName>jonas</fullName></author><authorEmail>jonas@jonasjelonek.de</authorEmail><comment>realtek: pcs: rtl931x: name SerDes registers and fields

Document RTL931x SerDes registers and fields, then replace magic offsets
and bit ranges at their call sites. Use FIELD_PREP() where values need
positioning and named masks for field updates.

Link: https://github.com/openwrt/openwrt/pull/25314
Signed-off-by: Jonas Jelonek &lt;jonas@jonasjelonek.de&gt;
</comment><date>2026-09-23 19:30:21 +0200</date><id>c1b568dbd7b297120e9df587acc56847c37159a3</id><msg>realtek: pcs: rtl931x: name SerDes registers and fields</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c</affectedPath><commitId>b532485b4e74cd6d112d7286a7068677080d9cde</commitId><timestamp>1790184621000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/jonas</absoluteUrl><fullName>jonas</fullName></author><authorEmail>jonas@jonasjelonek.de</authorEmail><comment>realtek: pcs: rtl83xx: name the SerDes soft reset field

Document the common SerDes soft-reset register and field. Replace magic
register values in the RTL838x and RTL839x reset sequences with named,
SDK-style masked field updates. Merge the two sequences by dropping the
RTL839x-specific delay - which is unneeded according to the SDK - and
provide a combined helper.

Link: https://github.com/openwrt/openwrt/pull/25314
Signed-off-by: Jonas Jelonek &lt;jonas@jonasjelonek.de&gt;
</comment><date>2026-09-23 19:30:21 +0200</date><id>b532485b4e74cd6d112d7286a7068677080d9cde</id><msg>realtek: pcs: rtl83xx: name the SerDes soft reset field</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c</affectedPath><commitId>4cf738158f88ad961a8873c79b1f25d8a633878a</commitId><timestamp>1790184622000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/jonas</absoluteUrl><fullName>jonas</fullName></author><authorEmail>jonas@jonasjelonek.de</authorEmail><comment>realtek: pcs: rtl930x: simplify XSG writes

XSG fan-out is only required for the low digital pages on SerDes 2 and
3. Apply the analog configuration tables through the normal write path
and remove the now-unused XSG table helper.

Limit the XSG operation to its supported targets, reuse the normal
RTL930x write for the first SerDes, and derive the companion from the
existing physical mapping.

Link: https://github.com/openwrt/openwrt/pull/25314
Signed-off-by: Jonas Jelonek &lt;jonas@jonasjelonek.de&gt;
</comment><date>2026-09-23 19:30:22 +0200</date><id>4cf738158f88ad961a8873c79b1f25d8a633878a</id><msg>realtek: pcs: rtl930x: simplify XSG writes</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c</affectedPath><commitId>76d313b2c60578948e68ec2994f671c7637243e3</commitId><timestamp>1790184622000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/jonas</absoluteUrl><fullName>jonas</fullName></author><authorEmail>jonas@jonasjelonek.de</authorEmail><comment>realtek: pcs: rtl930x: coalesce TX amplitude updates

Program impedance, pre-amplitude, and post-amplitude in that order so
dependent enable state is not exposed before its coefficient.

Then update the main amplitude and both enable bits together. This
replaces three REG07 read-modify-write transactions with one.

Link: https://github.com/openwrt/openwrt/pull/25314
Signed-off-by: Jonas Jelonek &lt;jonas@jonasjelonek.de&gt;
</comment><date>2026-09-23 19:30:22 +0200</date><id>76d313b2c60578948e68ec2994f671c7637243e3</id><msg>realtek: pcs: rtl930x: coalesce TX amplitude updates</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c</affectedPath><commitId>3c80700e134d75fdd16194ad51eb3ce693355056</commitId><timestamp>1790184622000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/jonas</absoluteUrl><fullName>jonas</fullName></author><authorEmail>jonas@jonasjelonek.de</authorEmail><comment>realtek: pcs: rtl930x: coalesce RX VTH updates

The positive and negative VTH values occupy disjoint fields in the same
register. Combine them into one masked read-modify-write instead of
updating each field separately.

Link: https://github.com/openwrt/openwrt/pull/25314
Signed-off-by: Jonas Jelonek &lt;jonas@jonasjelonek.de&gt;
</comment><date>2026-09-23 19:30:22 +0200</date><id>3c80700e134d75fdd16194ad51eb3ce693355056</id><msg>realtek: pcs: rtl930x: coalesce RX VTH updates</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/bcm53xx/Makefile</affectedPath><commitId>d2a80cdbd8060f9ec4de36f19769274d2712114b</commitId><timestamp>1790189037000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/jonas</absoluteUrl><fullName>jonas</fullName></author><authorEmail>jonas@jonasjelonek.de</authorEmail><comment>bcm53xx: switch to 6.18

Promote kernel 6.18 to the default KERNEL_PATCHVER for bcm53xx and
drop the KERNEL_TESTING_PATCHVER entry, since 6.18 is no longer the
testing kernel.

Signed-off-by: Rosen Penev &lt;rosenp@gmail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/25307
Signed-off-by: Jonas Jelonek &lt;jonas@jonasjelonek.de&gt;
</comment><date>2026-09-23 20:43:57 +0200</date><id>d2a80cdbd8060f9ec4de36f19769274d2712114b</id><msg>bcm53xx: switch to 6.18</msg><path><editType>edit</editType><file>target/linux/bcm53xx/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/bcm53xx/patches-6.12/321-v7.1-ARM-dts-BCM5301X-EA9200-add-USB-GPIOs.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/500-UBI-Detect-EOF-mark-and-erase-all-remaining-blocks.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/326-ARM-dts-BCM5301X-EA9200-use-network-LED-trigger.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/325-ARM-dts-BCM5301X-EA9200-set-MAC-from-nvram.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/314-ARM-dts-BCM5301X-EA6300-specify-switch.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/300-ARM-BCM5301X-Disable-MMU-and-Dcache-during-decompres.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/140-mtd-parsers-trx-parse-firmware-MTD-partitions-only.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/324-ARM-dts-BCM5301X-EA9200-add-wifi-definitions.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/304-ARM-dts-BCM5301X-Specify-switch-ports-for-remaining-.patch</affectedPath><affectedPath>target/linux/bcm53xx/config-6.12</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/320-v7.1-ARM-dts-BCM5301X-EA9200-add-WiFi-button.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/352-ARM-dts-BCM5301X-EA9200-fix-nvram-size.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/050-v6.13-ARM-dts-meraki-mr26-set-mac-address-for-gmac0.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/360-v7.2-ARM-dts-BCM5301X-R6300v2-fix-USB3.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/323-v7.1-ARM-dts-BCM5301X-EA9200-specify-partitions.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/312-v7.1-ARM-dts-BCM5301X-panamera-set-WAN-MAC-from-nvram.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/349-v7.1-ARM-dts-BCM5301X-Describe-PCIe-controllers-fully.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/340-meraki-mx6x-mac-base.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/315-ARM-dts-BCM5301X-phicomm-k3-specify-switch.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/322-v7.1-ARM-dts-BCM5301X-EA9200-add-LEDs.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/313-ARM-dts-BCM5301X-AC87U-specify-switch.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/333-bcm53xx-dts-meraki-mx6x-add-OpenWrt-specific-LED-ali.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/311-v7.1-ARM-dts-BCM5301X-EA9200-set-WAN-MAC-from-nvram.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/180-usb-xhci-add-support-for-performing-fake-doorbell.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/332-Meraki-MX6X-partition-fixups.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/331-v7.2-ARM-dts-NSP-Move-MX6X-pinctrl-config-to-PWM-node.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/361-v7.2-ARM-dts-BCM5301X-EA6500v2-fix-USB3.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/701-net-dsa-b53-disable-EAP-setup-on-Northstar-switches.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/351-PCI-iproc-Use-the-EROM-outbound-window-on-BCMA.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/350-v7.1-ARM-dts-BCM5301X-add-root-pcie-bridges.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/310-ARM-BCM5301X-Add-DT-for-Netgear-R7900.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/051-ARM-dts-meraki-mr26-wifi-MACs-in-dts.patch</affectedPath><affectedPath>target/linux/bcm53xx/patches-6.12/905-BCM53573-minor-hacks.patch</affectedPath><commitId>6a31f03522f5cbb829b9078863096058c82767fc</commitId><timestamp>1790189037000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/jonas</absoluteUrl><fullName>jonas</fullName></author><authorEmail>jonas@jonasjelonek.de</authorEmail><comment>bcm53xx: remove 6.12 files

Now that 6.18 is the only supported kernel version for bcm53xx,
remove the 6.12 kernel configs (config-6.12 and per-subtarget
config-6.12 files) and the entire patches-6.12 patch stack, as they
are no longer used.

Signed-off-by: Rosen Penev &lt;rosenp@gmail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/25307
Signed-off-by: Jonas Jelonek &lt;jonas@jonasjelonek.de&gt;
</comment><date>2026-09-23 20:43:57 +0200</date><id>6a31f03522f5cbb829b9078863096058c82767fc</id><msg>bcm53xx: remove 6.12 files</msg><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/314-ARM-dts-BCM5301X-EA6300-specify-switch.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/322-v7.1-ARM-dts-BCM5301X-EA9200-add-LEDs.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/304-ARM-dts-BCM5301X-Specify-switch-ports-for-remaining-.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/140-mtd-parsers-trx-parse-firmware-MTD-partitions-only.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/326-ARM-dts-BCM5301X-EA9200-use-network-LED-trigger.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/351-PCI-iproc-Use-the-EROM-outbound-window-on-BCMA.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/320-v7.1-ARM-dts-BCM5301X-EA9200-add-WiFi-button.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/311-v7.1-ARM-dts-BCM5301X-EA9200-set-WAN-MAC-from-nvram.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/051-ARM-dts-meraki-mr26-wifi-MACs-in-dts.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/352-ARM-dts-BCM5301X-EA9200-fix-nvram-size.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/340-meraki-mx6x-mac-base.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/324-ARM-dts-BCM5301X-EA9200-add-wifi-definitions.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/333-bcm53xx-dts-meraki-mx6x-add-OpenWrt-specific-LED-ali.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/500-UBI-Detect-EOF-mark-and-erase-all-remaining-blocks.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/361-v7.2-ARM-dts-BCM5301X-EA6500v2-fix-USB3.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/350-v7.1-ARM-dts-BCM5301X-add-root-pcie-bridges.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/905-BCM53573-minor-hacks.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/331-v7.2-ARM-dts-NSP-Move-MX6X-pinctrl-config-to-PWM-node.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/701-net-dsa-b53-disable-EAP-setup-on-Northstar-switches.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/310-ARM-BCM5301X-Add-DT-for-Netgear-R7900.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/050-v6.13-ARM-dts-meraki-mr26-set-mac-address-for-gmac0.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/325-ARM-dts-BCM5301X-EA9200-set-MAC-from-nvram.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/180-usb-xhci-add-support-for-performing-fake-doorbell.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/313-ARM-dts-BCM5301X-AC87U-specify-switch.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/312-v7.1-ARM-dts-BCM5301X-panamera-set-WAN-MAC-from-nvram.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/315-ARM-dts-BCM5301X-phicomm-k3-specify-switch.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/300-ARM-BCM5301X-Disable-MMU-and-Dcache-during-decompres.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/321-v7.1-ARM-dts-BCM5301X-EA9200-add-USB-GPIOs.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/config-6.12</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/332-Meraki-MX6X-partition-fixups.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/323-v7.1-ARM-dts-BCM5301X-EA9200-specify-partitions.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/360-v7.2-ARM-dts-BCM5301X-R6300v2-fix-USB3.patch</file></path><path><editType>delete</editType><file>target/linux/bcm53xx/patches-6.12/349-v7.1-ARM-dts-BCM5301X-Describe-PCIe-controllers-fully.patch</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/phy/realtek/realtek_multiport.c</affectedPath><commitId>2c9a3999e452135fbc1e2be906832d7e77d1fda6</commitId><timestamp>1790190608000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/jonas</absoluteUrl><fullName>jonas</fullName></author><authorEmail>jonas@jonasjelonek.de</authorEmail><comment>realtek: phy: fix RTL8218E second XSGMII channel group

The RTL8218E exposes XSGMII as one logical SerDes, but its eight
MAC-side channels are represented by two groups of four. The initial
setup disables autonegotiation only for the first group on page 0x400,
leaving the second group on page 0x500 in autonegotiation mode.

Consequently, the first four package ports pass traffic while the
remaining four establish copper link but do not pass packets. Disable
XSGMII autonegotiation for the second group as well by forcing
register 0x500.12[9:8] to 01.

This changes 0x500.12 from 0x70d0 to 0x71d0 and brings
0x507.15[7:4] from 0 to 0xf on hardware, after which all eight ports
pass traffic.

Fixes: 2db820be865f ("realtek: phy: fix RTL8218E XSGMII initialization")
Assisted-by: ChatGPT (OpenAI GPT-5.6 Sol)
Link: https://github.com/openwrt/openwrt/pull/25364
Signed-off-by: Jonas Jelonek &lt;jonas@jonasjelonek.de&gt;
</comment><date>2026-09-23 21:10:08 +0200</date><id>2c9a3999e452135fbc1e2be906832d7e77d1fda6</id><msg>realtek: phy: fix RTL8218E second XSGMII channel group</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/phy/realtek/realtek_multiport.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/base-files/etc/board.d/02_network</affectedPath><affectedPath>target/linux/realtek/image/rtl930x.mk</affectedPath><affectedPath>target/linux/realtek/dts/rtl9302_ubnt_usw-pro-max-24-poe.dts</affectedPath><commitId>98f3808362bec6dc5eee0479be7f4239efbfa91e</commitId><timestamp>1790190901000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/jonas</absoluteUrl><fullName>jonas</fullName></author><authorEmail>jonas@jonasjelonek.de</authorEmail><comment>realtek: add support for Ubiquiti UniFi USW Pro Max 24 PoE

Add support for RTL9302B-based Ubiquiti UniFi USW Pro Max 24 PoE switch
with 16x GbE and 8x 2.5G RJ45 ports, 2x SFP+, and a front display.

Hardware
========

  - RTL9302B switch SoC
  - 512 MiB RAM
  - 32 MiB SPI-NOR flash
  - 16x 100M/1G RJ45 ports via 2x RTL8218E
  - 8x 100M/1G/2.5G RJ45 ports via 2x RTL8224
  - PoE:
      - 400W total budget
      - 8x 802.3at, 32W per port (ports 1-8)
      - 16x 802.3bt, 60W per port (ports 9-24)
  - 2x SFP+ ports
  - Buttons: 1x Reset
  - LEDs: RGBW LED per port (Etherlighting)
  - Front touch display via USB ACM (see below)
  - Console: TTL 3.3V, 115200 8N1 (internal pin header close to SoC;
    layout front to back: VCC RX TX GND)
  - Etherlighting feature (lighting patterns and color control)
  - Vendor firmware: U-Boot + LEDE-based Ubiquiti OS

MAC address
===========

Single MAC address in EEPROM partition, applied to all ports.

Front touch display
===================

The unit has a touch-capable front display, driven by a dedicated
STM32-based MCU. Unlike other Ubiquiti switches where the MCU is
connected to the SoC via UART directly, here it is exposed as a USB
CDC-ACM serial device through an on-board Genesys Logic GL850G USB hub.
The MCU runs Ubiquiti's LCM firmware and exposes a high-level JSON
protocol (page selection, button-press events, etc.); arbitrary
pixel-level control is not possible without replacing the MCU firmware.
Display support therefore depends on both USB host support and a driver
for the LCM protocol, neither of which is currently available.

Known issues
============

  - Etherlighting not controllable, driver WIP. Port LEDs for link work
    though. By default, the controller keeps the LEDs in a breathing
    state, gated by the link state delivered by the Realtek SoC.

Disclaimer
==========

Stock firmware uses a dual-bank layout (kernel0/kernel1, ~15 MiB each).
OpenWrt replaces both banks with a single contiguous firmware partition.
Flashing OpenWrt writes or invalidates both stock kernel slots; U-Boot
remains intact and can be used for recovery.

Installation
============

1. Enable SSH on the stock UniFi OS and log in with user account.

2. Copy the OpenWrt sysupgrade image to /tmp on the switch (e.g. via
   scp).

3. Adjust IMG below to point at the copied file, then run the block as a
   whole. It verifies the expected stock partition layout and image size,
   writes kernel0, splits into kernel1 if the image is larger than that
   slot (otherwise invalidates kernel1 so U-Boot cannot pick a stale
   bank), and reboots:

   set -e
   IMG=/tmp/openwrt-realtek-rtl930x-ubnt_usw-pro-max-24-poe-squashfs-sysupgrade.bin
   K0_SIZE=$((0xf10000))
   K0_BLOCKS=$((K0_SIZE / 0x10000))

   grep -q '^mtd2: 00f10000 00010000 "kernel0"$' /proc/mtd
   grep -q '^mtd3: 00f20000 00010000 "kernel1"$' /proc/mtd
   IMG_SIZE=$(wc -c &lt; "$IMG")
   [ "$IMG_SIZE" -gt 0 ]
   [ "$IMG_SIZE" -le $((0x1e30000)) ]

   dd if="$IMG" of=/dev/mtdblock2 bs=64k count=$K0_BLOCKS conv=fsync
   if [ "$IMG_SIZE" -gt "$K0_SIZE" ]; then
       dd if="$IMG" of=/dev/mtdblock3 bs=64k skip=$K0_BLOCKS conv=fsync
   else
       dd if=/dev/zero of=/dev/mtdblock3 bs=64k count=1 conv=fsync
   fi
   sync
   reboot

   The switch comes up in OpenWrt after reboot.

4. It is recommended to modify the bootcmd to speed up the boot and
   prevent any issues due to the dual-boot selection. Since U-Boot by
   default uses bootubnt which does a lot of (unneeded) RTK
   initialization, quite some time passes until Linux is started.
   Additionally, the U-Boot logic fiddles with some bits on flash which
   causes JFFS2 errors in OpenWrt. While this doesn't seem to cause
   issues yet, be defensive and set the bootcmd from OpenWrt with:

     fw_setenv bootcmd 'bootm 0xb40b0000'
     fw_printenv bootcmd

   This directly boots the uImage from flash, without doing all the
   initialization. OpenWrt is able to bootstrap the networking
   completely on its own.

It does not matter which bank stock booted from when the dd block
runs: both banks are touched in the same pass (kernel0 written, kernel1
either written or invalidated). With kernel1 invalidated, U-Boot's
internal fallback kicks in and permanently switches to kernel0 on the
next boot, so the device stays on OpenWrt as long as kernel0 is
bootable.

Recovery
========

Since the installation procedure invalidates or partially overwrites
the second bank, recovery requires serial console access (see Hardware
above for pinout).

1. Interrupt U-Boot autoboot by spamming a key during early boot to
   drop into the U-Boot prompt.

2. Bring up networking:

   rtk network on

3. Transfer an OpenWrt initramfs image via TFTP and boot it:

   tftpboot 0x82000000 &lt;server&gt;:&lt;initramfs.bin&gt;
   bootm 0x82000000

4. From the running initramfs OpenWrt, do a sysupgrade to reflash
   OpenWrt or whatever you want to recover. There is no need for the
   complicated procedure from installation since OpenWrt sees the
   firmware partition already as a whole.

Return to stock firmware
========================

There is no fully-supported revert path. The stock firmware blob is a
Ubiquiti UBNT archive (header + parts, see firmware-utils' fw.h) that
embeds a u-boot and a kernel0 uImage payload; only the latter is
relevant when writing back to the kernel partitions.

The snippet below extracts the kernel0 uImage from such a blob by
locating the uImage magic and using the size carried in the uImage
header itself, without parsing any UBNT framing. It is provided as a
best-effort starting point; verify the result before flashing,
otherwise you're on your own:

   BLOB=&lt;firmware.bin&gt;
   OFF=$(grep -aboF $'\x27\x05\x19\x56' "$BLOB" | head -1 | cut -d: -f1)
   SIZE=$(( $(dd if="$BLOB" bs=1 skip=$((OFF + 12)) count=4 2&gt;/dev/null \
               | hexdump -e '1/4 "%u"') + 64 ))
   dd if="$BLOB" of=kernel0.uImage bs=1 skip="$OFF" count="$SIZE"

Once you have a clean uImage, boot an OpenWrt initramfs as described in
Recovery, copy kernel0.uImage to /tmp, and run:

   set -e
   [ "$(wc -c &lt; /tmp/kernel0.uImage)" -le $((0xf10000)) ] || exit 1
   mtd write /tmp/kernel0.uImage firmware
   fw_setenv bootcmd bootubnt
   fw_printenv bootcmd
   reboot

After rebooting, Ubiquiti's firmware should boot.

Or, if you made backups of the flash before installation, just write
the backup back to flash.

Link: https://github.com/openwrt/openwrt/pull/25280
Signed-off-by: Jonas Jelonek &lt;jonas@jonasjelonek.de&gt;
</comment><date>2026-09-23 21:15:01 +0200</date><id>98f3808362bec6dc5eee0479be7f4239efbfa91e</id><msg>realtek: add support for Ubiquiti UniFi USW Pro Max 24 PoE</msg><path><editType>edit</editType><file>target/linux/realtek/base-files/etc/board.d/02_network</file></path><path><editType>add</editType><file>target/linux/realtek/dts/rtl9302_ubnt_usw-pro-max-24-poe.dts</file></path><path><editType>edit</editType><file>target/linux/realtek/image/rtl930x.mk</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://taiha.net/jenkins/user/robert.marko</absoluteUrl><fullName>robert.marko</fullName><id>robert.marko</id></culprit><culprit><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName><id>robimarko</id></culprit><culprit><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName><id>markus.stockhausen</id></culprit><culprit><absoluteUrl>https://taiha.net/jenkins/user/daniel</absoluteUrl><fullName>daniel</fullName><id>daniel</id></culprit><culprit><absoluteUrl>https://taiha.net/jenkins/user/nbd</absoluteUrl><fullName>nbd</fullName><id>nbd</id></culprit><culprit><absoluteUrl>https://taiha.net/jenkins/user/john</absoluteUrl><fullName>john</fullName><id>john</id></culprit><culprit><absoluteUrl>https://taiha.net/jenkins/user/jonas</absoluteUrl><fullName>jonas</fullName><id>jonas</id></culprit></freeStyleBuild>