{
  "_class" : "hudson.model.FreeStyleBuild",
  "actions" : [
    {
      "_class" : "hudson.model.CauseAction",
      "causes" : [
        {
          "_class" : "org.jenkinsci.plugins.parameterizedscheduler.ParameterizedTimerTriggerCause",
          "shortDescription" : "Started by timer with parameters: {BUILD_CFG_TARGET_DEV=WG1400HP/WG1800HP/WG1800HP2 (QCA9558)}"
        }
      ]
    },
    {
      "_class" : "hudson.model.ParametersAction",
      "parameters" : [
        {
          "_class" : "hudson.model.BooleanParameterValue",
          "name" : "BUILD_CFG_DISTCLEAN",
          "value" : true
        },
        {
          "_class" : "hudson.model.BooleanParameterValue",
          "name" : "BUILD_CFG_DIFFCONFIG",
          "value" : true
        },
        {
          "_class" : "hudson.model.StringParameterValue",
          "name" : "BUILD_CFG_TARGET_DEV",
          "value" : "WG1400HP/WG1800HP/WG1800HP2 (QCA9558)"
        }
      ]
    },
    {
      "_class" : "hudson.plugins.git.util.BuildData",
      "buildsByBranchName" : {
        "refs/remotes/origin/main" : {
          "_class" : "hudson.plugins.git.util.Build",
          "buildNumber" : 497,
          "buildResult" : null,
          "marked" : {
            "SHA1" : "98f3808362bec6dc5eee0479be7f4239efbfa91e",
            "branch" : [
              {
                "SHA1" : "98f3808362bec6dc5eee0479be7f4239efbfa91e",
                "name" : "refs/remotes/origin/main"
              }
            ]
          },
          "revision" : {
            "SHA1" : "98f3808362bec6dc5eee0479be7f4239efbfa91e",
            "branch" : [
              {
                "SHA1" : "98f3808362bec6dc5eee0479be7f4239efbfa91e",
                "name" : "refs/remotes/origin/main"
              }
            ]
          }
        }
      },
      "lastBuiltRevision" : {
        "SHA1" : "98f3808362bec6dc5eee0479be7f4239efbfa91e",
        "branch" : [
          {
            "SHA1" : "98f3808362bec6dc5eee0479be7f4239efbfa91e",
            "name" : "refs/remotes/origin/main"
          }
        ]
      },
      "remoteUrls" : [
        "https://github.com/openwrt/openwrt"
      ],
      "scmName" : ""
    },
    {
      
    },
    {
      
    },
    {
      
    },
    {
      
    },
    {
      "_class" : "org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction"
    }
  ],
  "artifacts" : [
    {
      "displayPath" : "config.buildinfo",
      "fileName" : "config.buildinfo",
      "relativePath" : "bin/targets/ath79/generic/config.buildinfo"
    },
    {
      "displayPath" : "feeds.buildinfo",
      "fileName" : "feeds.buildinfo",
      "relativePath" : "bin/targets/ath79/generic/feeds.buildinfo"
    },
    {
      "displayPath" : "openwrt-ath79-generic-nec_wg1400hp-initramfs-factory.bin",
      "fileName" : "openwrt-ath79-generic-nec_wg1400hp-initramfs-factory.bin",
      "relativePath" : "bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1400hp-initramfs-factory.bin"
    },
    {
      "displayPath" : "openwrt-ath79-generic-nec_wg1400hp-initramfs-kernel.bin",
      "fileName" : "openwrt-ath79-generic-nec_wg1400hp-initramfs-kernel.bin",
      "relativePath" : "bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1400hp-initramfs-kernel.bin"
    },
    {
      "displayPath" : "openwrt-ath79-generic-nec_wg1400hp-squashfs-sysupgrade.bin",
      "fileName" : "openwrt-ath79-generic-nec_wg1400hp-squashfs-sysupgrade.bin",
      "relativePath" : "bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1400hp-squashfs-sysupgrade.bin"
    },
    {
      "displayPath" : "openwrt-ath79-generic-nec_wg1400hp-uboot.bin",
      "fileName" : "openwrt-ath79-generic-nec_wg1400hp-uboot.bin",
      "relativePath" : "bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1400hp-uboot.bin"
    },
    {
      "displayPath" : "openwrt-ath79-generic-nec_wg1800hp-initramfs-factory.bin",
      "fileName" : "openwrt-ath79-generic-nec_wg1800hp-initramfs-factory.bin",
      "relativePath" : "bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1800hp-initramfs-factory.bin"
    },
    {
      "displayPath" : "openwrt-ath79-generic-nec_wg1800hp-initramfs-kernel.bin",
      "fileName" : "openwrt-ath79-generic-nec_wg1800hp-initramfs-kernel.bin",
      "relativePath" : "bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1800hp-initramfs-kernel.bin"
    },
    {
      "displayPath" : "openwrt-ath79-generic-nec_wg1800hp-squashfs-sysupgrade.bin",
      "fileName" : "openwrt-ath79-generic-nec_wg1800hp-squashfs-sysupgrade.bin",
      "relativePath" : "bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1800hp-squashfs-sysupgrade.bin"
    },
    {
      "displayPath" : "openwrt-ath79-generic-nec_wg1800hp-uboot.bin",
      "fileName" : "openwrt-ath79-generic-nec_wg1800hp-uboot.bin",
      "relativePath" : "bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1800hp-uboot.bin"
    },
    {
      "displayPath" : "openwrt-ath79-generic-nec_wg1800hp2-initramfs-factory.bin",
      "fileName" : "openwrt-ath79-generic-nec_wg1800hp2-initramfs-factory.bin",
      "relativePath" : "bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1800hp2-initramfs-factory.bin"
    },
    {
      "displayPath" : "openwrt-ath79-generic-nec_wg1800hp2-initramfs-kernel.bin",
      "fileName" : "openwrt-ath79-generic-nec_wg1800hp2-initramfs-kernel.bin",
      "relativePath" : "bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1800hp2-initramfs-kernel.bin"
    },
    {
      "displayPath" : "openwrt-ath79-generic-nec_wg1800hp2-squashfs-sysupgrade.bin",
      "fileName" : "openwrt-ath79-generic-nec_wg1800hp2-squashfs-sysupgrade.bin",
      "relativePath" : "bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1800hp2-squashfs-sysupgrade.bin"
    },
    {
      "displayPath" : "openwrt-ath79-generic-nec_wg1800hp2-uboot.bin",
      "fileName" : "openwrt-ath79-generic-nec_wg1800hp2-uboot.bin",
      "relativePath" : "bin/targets/ath79/generic/openwrt-ath79-generic-nec_wg1800hp2-uboot.bin"
    },
    {
      "displayPath" : "openwrt-ath79-generic.manifest",
      "fileName" : "openwrt-ath79-generic.manifest",
      "relativePath" : "bin/targets/ath79/generic/openwrt-ath79-generic.manifest"
    },
    {
      "displayPath" : "profiles.json",
      "fileName" : "profiles.json",
      "relativePath" : "bin/targets/ath79/generic/profiles.json"
    },
    {
      "displayPath" : "sha256sums",
      "fileName" : "sha256sums",
      "relativePath" : "bin/targets/ath79/generic/sha256sums"
    },
    {
      "displayPath" : "version.buildinfo",
      "fileName" : "version.buildinfo",
      "relativePath" : "bin/targets/ath79/generic/version.buildinfo"
    }
  ],
  "building" : false,
  "description" : "diffconfig: true, device: WG1400HP/WG1800HP/WG1800HP2 (QCA9558)",
  "displayName" : "#497",
  "duration" : 2172135,
  "estimatedDuration" : 2195975,
  "executor" : null,
  "fullDisplayName" : "OpenWrt (master) for NEC Aterm (NetBSD based) #497",
  "id" : "497",
  "inProgress" : false,
  "keepLog" : false,
  "number" : 497,
  "queueId" : 62,
  "result" : "SUCCESS",
  "timestamp" : 1790220000646,
  "url" : "https://taiha.net/jenkins/job/OpenWrt-master-NEC-BSD-Aterm/497/",
  "builtOn" : "home-slave02_taihasv",
  "changeSet" : {
    "_class" : "hudson.plugins.git.GitChangeSetList",
    "items" : [
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/generic/backport-6.18/852-v7.1-rtc-cmos-use-platform_get_irq_optional.patch"
        ],
        "commitId" : "5c95472821ea421a600547a508a2abe36c697447",
        "timestamp" : 1789978466000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robimarko",
          "fullName" : "robimarko"
        },
        "authorEmail" : "robimarko@gmail.com",
        "comment" : "kernel: backport rtc-cmos use platform_get_irq_optional()\u000a\u000aBackport upstream commit e9f850ba66cd (\"rtc: cmos: Use\u000aplatform_get_irq_optional() in cmos_platform_probe()\"),\u000awhich landed in v7.1.\u000a\u000aThe rtc-cmos driver can live without an IRQ and returning an error\u000acode from platform_get_irq() is not a problem for it in general, so\u000amake it call platform_get_irq_optional() in cmos_platform_probe()\u000ainstead of platform_get_irq() to avoid a confusing error message\u000aprinted by the latter if an IRQ cannot be found for index 0, which\u000ais possible on x86 platforms.\u000a\u000aAdditionally, on x86, if the IRQ is not defined and the system has\u000aa legacy PIC, hardcode it to RTC_IRQ, which should be safe then (and\u000awhich is what the dropped PNP code did).\u000a\u000aFixes: https://github.com/openwrt/openwrt/issues/25248\u000a\u000aSigned-off-by: Andy Chiang <AndyChiang_git@outlook.com>\u000aLink: https://github.com/openwrt/openwrt/pull/25264\u000aSigned-off-by: Robert Marko <robimarko@gmail.com>\u000a",
        "date" : "2026-09-21 10:14:26 +0200",
        "id" : "5c95472821ea421a600547a508a2abe36c697447",
        "msg" : "kernel: backport rtc-cmos use platform_get_irq_optional()",
        "paths" : [
          {
            "editType" : "add",
            "file" : "target/linux/generic/backport-6.18/852-v7.1-rtc-cmos-use-platform_get_irq_optional.patch"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/generic/backport-6.18/798-v7.1-net-phy-mxl-gpy-add-PHY-level-statistics-via-ethtool.patch",
          "target/linux/generic/backport-6.18/720-v7.2-net-phy-intel-xway-add-PHY-level-statistics-via-etht.patch"
        ],
        "commitId" : "41f9a2065d51829faf14ccdec7ad44df0a447280",
        "timestamp" : 1789978897000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robimarko",
          "fullName" : "robimarko"
        },
        "authorEmail" : "robimarko@gmail.com",
        "comment" : "kernel: backport Lantiq and Maxlinear PHY level statistics support\u000a\u000aBackport Lantiq and Maxlineat PHY level statistics support. These\u000astatistics count frames dropped by the PHY due to invalid symbols\u000aon layer 1.\u000a\u000aTested on Lantiq/Maxlinear GPY111:\u000aroot@OpenWrt:~# ethtool -S lan3 --groups eth-phy\u000aStandard stats for lan3:\u000aeth-phy-SymbolErrorDuringCarrier: 856\u000a\u000aSigned-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>\u000aLink: https://github.com/openwrt/openwrt/pull/25282\u000aSigned-off-by: Robert Marko <robimarko@gmail.com>\u000a",
        "date" : "2026-09-21 10:21:37 +0200",
        "id" : "41f9a2065d51829faf14ccdec7ad44df0a447280",
        "msg" : "kernel: backport Lantiq and Maxlinear PHY level statistics support",
        "paths" : [
          {
            "editType" : "add",
            "file" : "target/linux/generic/backport-6.18/798-v7.1-net-phy-mxl-gpy-add-PHY-level-statistics-via-ethtool.patch"
          },
          {
            "editType" : "add",
            "file" : "target/linux/generic/backport-6.18/720-v7.2-net-phy-intel-xway-add-PHY-level-statistics-via-etht.patch"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tools/xz/Makefile"
        ],
        "commitId" : "cce54a1d82a33ede9e917d3bf90df573cf033484",
        "timestamp" : 1789990093000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robimarko",
          "fullName" : "robimarko"
        },
        "authorEmail" : "robimarko@gmail.com",
        "comment" : "tools/xz: update to version 5.8.4\u000a\u000aRelease Notes:\u000ahttps://github.com/tukaani-project/xz/releases/tag/v5.8.4\u000a\u000aSigned-off-by: Shiji Yang <yangshiji66@outlook.com>\u000aLink: https://github.com/openwrt/openwrt/pull/25295\u000aSigned-off-by: Robert Marko <robimarko@gmail.com>\u000a",
        "date" : "2026-09-21 13:28:13 +0200",
        "id" : "cce54a1d82a33ede9e917d3bf90df573cf033484",
        "msg" : "tools/xz: update to version 5.8.4",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tools/xz/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/qualcommax/ipq807x/base-files/etc/board.d/02_network"
        ],
        "commitId" : "c618c6a353f2adafab4c182224739d3687896e49",
        "timestamp" : 1789990234000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robimarko",
          "fullName" : "robimarko"
        },
        "authorEmail" : "robimarko@gmail.com",
        "comment" : "qualcommax: ipq807x: ax89x: use lan1 for failsafe\u000a\u000aThe default failsafe script just takes the first interface from the UCI LAN\u000ainteface list, so its currently using the SFP interface in failsafe.\u000a\u000aSince this is not convenient at all, change the order so that lan1 will now\u000abe used for failsafe instead.\u000a\u000aFixes: #23633\u000aSigned-off-by: Robert Marko <robimarko@gmail.com>\u000a",
        "date" : "2026-09-21 13:30:34 +0200",
        "id" : "c618c6a353f2adafab4c182224739d3687896e49",
        "msg" : "qualcommax: ipq807x: ax89x: use lan1 for failsafe",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/qualcommax/ipq807x/base-files/etc/board.d/02_network"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/vlan.c",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/dsa.c",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl930x.c",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/common.c",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/stp.c",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl839x.c",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl838x.c",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/Makefile",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/vlan.h",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/debugfs.c",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl931x.c",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/stp.h",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl-otto.h"
        ],
        "commitId" : "14651b96832a9f9cef3b7bdcfb3dfecf9161ac58",
        "timestamp" : 1790005920000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: dsa: move STP and MST handling into a separate source file\u000a\u000aSTP and MST handling is spread across dsa.c, common.c and the\u000achip-specific source files. Group it in stp.c to keep port state\u000ahandling, MST slot management and hardware access together.\u000a\u000aMove the associated function comments and register definitions with\u000athe implementation. Add stp.h for the shared declarations and MST slot\u000astructure, and update the callers and Makefile.\u000a\u000aReplace the spanning-tree control register field with a per-chip\u000ainitialization callback so the register definitions remain private to\u000astp.c. Add a helper for updating non-CIST port states during bridge\u000ajoin and leave.\u000a\u000aPreserve the existing locking and forwarding behavior, and remove\u000aexcess blank lines left by the moved code.\u000a\u000aAssisted-by: ChatGPT (OpenAI GPT-6 Astra)\u000aLink: https://github.com/openwrt/openwrt/pull/25292\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-09-21 17:52:00 +0200",
        "id" : "14651b96832a9f9cef3b7bdcfb3dfecf9161ac58",
        "msg" : "realtek: dsa: move STP and MST handling into a separate source file",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/vlan.c"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl839x.c"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/vlan.h"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl931x.c"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl838x.c"
          },
          {
            "editType" : "add",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/stp.c"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/debugfs.c"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/common.c"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/dsa.c"
          },
          {
            "editType" : "add",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/stp.h"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl-otto.h"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl930x.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/qualcommbe/image/ipq95xx.mk"
        ],
        "commitId" : "f6442c8840b891214b9814f499d41c383d250932",
        "timestamp" : 1790064218000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robimarko",
          "fullName" : "robimarko"
        },
        "authorEmail" : "robimarko@gmail.com",
        "comment" : "qualcommbe: ipq95xx: drop KERNEL_LOADADDR for askey_sbe1v1k\u000a\u000aaskey_sbe1v1k currently sets KERNEL_LOADADDR to 0x42080000, which is not\u000a2MB-aligned. This trips the arm64 boot code's alignment check and\u000aprints the following warning on every boot:\u000a\u000a  [Firmware Bug]: Kernel image misaligned at boot, please fix your\u000a  bootloader!\u000a\u000a0x42080000 is a 2MB-aligned base plus the legacy TEXT_OFFSET of\u000a0x80000, which arm64 kernels used before v5.8. Since v5.8, TEXT_OFFSET\u000ais fixed at 0, so the kernel now expects the load address itself to sit\u000aon a 2MB boundary. This target runs on much newer kernels, so the old\u000aoffset is stale and only serves to trigger the FW_BUG warning.\u000a\u000aInstead of manually shifting the address, drop the device-specific\u000aKERNEL_LOADADDR override entirely. This allows the image to fall back\u000ato the target's default load address (0x41000000), which is properly\u000a2MB-aligned and cleanly resolves the alignment warning.\u000a\u000aVerified by both TFTP-booting the .itb and flashing the generated\u000asysupgrade image to a physical bare-metal device. The device boots\u000acleanly, operates stably, and the misalignment warning no longer appears.\u000a\u000aSigned-off-by: Jackie Han <jackie.han@gmail.com>\u000aLink: https://github.com/openwrt/openwrt/pull/25283\u000aSigned-off-by: Robert Marko <robimarko@gmail.com>\u000a",
        "date" : "2026-09-22 10:03:38 +0200",
        "id" : "f6442c8840b891214b9814f499d41c383d250932",
        "msg" : "qualcommbe: ipq95xx: drop KERNEL_LOADADDR for askey_sbe1v1k",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/qualcommbe/image/ipq95xx.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/qualcommax/dts/ipq6018-mr7500.dts"
        ],
        "commitId" : "773a9c473f735289f9f8b608c5ade2a7e0778541",
        "timestamp" : 1790067110000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robimarko",
          "fullName" : "robimarko"
        },
        "authorEmail" : "robimarko@gmail.com",
        "comment" : "qualcommax: fix partition map and GPIO polarity for MR7500\u000a\u000aUpdates the MR7500 DTS to correctly map the partition containing the WAN\u000aPHY firmware.\u000aAlso fixes inverted PHY reset polarity.\u000a\u000aSigned-off-by: Ross Barnes-Brown <true.robot.ross@gmail.com>\u000aSigned-off-by: Paweł Owoc <frut3k7@gmail.com>\u000aCo-authored-by: Paweł Owoc <frut3k7@gmail.com>\u000a",
        "date" : "2026-09-22 10:51:50 +0200",
        "id" : "773a9c473f735289f9f8b608c5ade2a7e0778541",
        "msg" : "qualcommax: fix partition map and GPIO polarity for MR7500",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/qualcommax/dts/ipq6018-mr7500.dts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/generic/pending-6.18/739-05-net-pcs-add-driver-for-MediaTek-USXGMII-PCS.patch"
        ],
        "commitId" : "328acd4e9d3407758c55917484823bc1726df64a",
        "timestamp" : 1790076459000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robimarko",
          "fullName" : "robimarko"
        },
        "authorEmail" : "robimarko@gmail.com",
        "comment" : "generic: remove Kconfig.orig from USXGMII PCS patch\u000a\u000aThe imported PCS patch accidentlly adds drivers/net/pcs/Kconfig.orig.\u000aRemove this file from the patch.\u000a\u000aFixes: 18cbd83a1443 (\"generic: 6.18: import updated standalone PCS handling\")\u000aSigned-off-by: Zhengping Zhang <zhengping.zhang@airoha.com>\u000aLink: https://github.com/openwrt/openwrt/pull/25319\u000aSigned-off-by: Robert Marko <robimarko@gmail.com>\u000a",
        "date" : "2026-09-22 13:27:39 +0200",
        "id" : "328acd4e9d3407758c55917484823bc1726df64a",
        "msg" : "generic: remove Kconfig.orig from USXGMII PCS patch",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/generic/pending-6.18/739-05-net-pcs-add-driver-for-MediaTek-USXGMII-PCS.patch"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/microchipsw/patches-6.18/0015-spi-atmel-quadspi-use-init-callback-for-gclk-variant.patch",
          "target/linux/microchipsw/patches-6.18/0016-spi-atmel-quadspi-add-LAN969x-QSPI-support.patch",
          "target/linux/microchipsw/patches-6.18/0014-v7.3-spi-atmel-quadspi-add-controller-init-callback.patch",
          "target/linux/microchipsw/patches-6.18/0017-arm64-dts-microchip-lan969x-add-QSPI-nodes.patch",
          "target/linux/microchipsw/patches-6.18/0017-v7.3-arm64-dts-microchip-lan969x-add-QSPI-nodes.patch",
          "target/linux/microchipsw/patches-6.18/0016-v7.3-spi-atmel-quadspi-add-LAN969x-QSPI-support.patch",
          "target/linux/microchipsw/patches-6.18/0015-v7.3-spi-atmel-quadspi-use-init-callback-for-gclk-variant.patch",
          "target/linux/microchipsw/patches-6.18/0014-spi-atmel-quadspi-add-controller-init-callback.patch"
        ],
        "commitId" : "809afa7e4312230beccb6829ed255f9b2f324290",
        "timestamp" : 1790081597000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robert.marko",
          "fullName" : "robert.marko"
        },
        "authorEmail" : "robert.marko@sartura.hr",
        "comment" : "microchipsw: add version to QSPI backport\u000a\u000aQSPI support was merged into 7.3, so mark the patches as such.\u000a\u000aSigned-off-by: Robert Marko <robert.marko@sartura.hr>\u000a",
        "date" : "2026-09-22 14:53:17 +0200",
        "id" : "809afa7e4312230beccb6829ed255f9b2f324290",
        "msg" : "microchipsw: add version to QSPI backport",
        "paths" : [
          {
            "editType" : "delete",
            "file" : "target/linux/microchipsw/patches-6.18/0014-spi-atmel-quadspi-add-controller-init-callback.patch"
          },
          {
            "editType" : "add",
            "file" : "target/linux/microchipsw/patches-6.18/0015-v7.3-spi-atmel-quadspi-use-init-callback-for-gclk-variant.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/microchipsw/patches-6.18/0017-arm64-dts-microchip-lan969x-add-QSPI-nodes.patch"
          },
          {
            "editType" : "add",
            "file" : "target/linux/microchipsw/patches-6.18/0016-v7.3-spi-atmel-quadspi-add-LAN969x-QSPI-support.patch"
          },
          {
            "editType" : "add",
            "file" : "target/linux/microchipsw/patches-6.18/0014-v7.3-spi-atmel-quadspi-add-controller-init-callback.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/microchipsw/patches-6.18/0015-spi-atmel-quadspi-use-init-callback-for-gclk-variant.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/microchipsw/patches-6.18/0016-spi-atmel-quadspi-add-LAN969x-QSPI-support.patch"
          },
          {
            "editType" : "add",
            "file" : "target/linux/microchipsw/patches-6.18/0017-v7.3-arm64-dts-microchip-lan969x-add-QSPI-nodes.patch"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/microchipsw/patches-6.18/102-arm64-dts-microchip-ev23x71a-enable-QSPI.patch",
          "target/linux/microchipsw/patches-6.18/100-mmc-sdhci-of-at91-disable-selectively-clocks-on-pm-r.patch",
          "target/linux/microchipsw/patches-6.18/100-dt-bindings-mmc-atmel-sama5d2-sdhci-add-LAN969x-comp.patch",
          "target/linux/microchipsw/patches-6.18/101-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch",
          "target/linux/microchipsw/patches-6.18/104-arm64-dts-microchip-ev23x71a-enable-QSPI.patch",
          "target/linux/microchipsw/patches-6.18/101-dt-bindings-mmc-atmel-sama5d2-sdhci-add-LAN969x-comp.patch",
          "target/linux/microchipsw/patches-6.18/105-arm64-dts-microchip-ev23x71a-enable-eMMC.patch",
          "target/linux/microchipsw/patches-6.18/102-mmc-sdhci-of-at91-add-LAN969x-support.patch",
          "target/linux/microchipsw/patches-6.18/103-arm64-dts-microchip-ev23x71a-enable-eMMC.patch",
          "target/linux/microchipsw/patches-6.18/103-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch"
        ],
        "commitId" : "6727587d2439cca176aa948392ba34f04515f3d4",
        "timestamp" : 1790081597000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robert.marko",
          "fullName" : "robert.marko"
        },
        "authorEmail" : "robert.marko@sartura.hr",
        "comment" : "microchipsw: use latest MMC patches\u000a\u000aUse the latest version of MMC patches pending upstream.\u000a\u000aSigned-off-by: Robert Marko <robert.marko@sartura.hr>\u000a",
        "date" : "2026-09-22 14:53:17 +0200",
        "id" : "6727587d2439cca176aa948392ba34f04515f3d4",
        "msg" : "microchipsw: use latest MMC patches",
        "paths" : [
          {
            "editType" : "add",
            "file" : "target/linux/microchipsw/patches-6.18/103-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/microchipsw/patches-6.18/102-arm64-dts-microchip-ev23x71a-enable-QSPI.patch"
          },
          {
            "editType" : "add",
            "file" : "target/linux/microchipsw/patches-6.18/105-arm64-dts-microchip-ev23x71a-enable-eMMC.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/microchipsw/patches-6.18/101-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch"
          },
          {
            "editType" : "add",
            "file" : "target/linux/microchipsw/patches-6.18/104-arm64-dts-microchip-ev23x71a-enable-QSPI.patch"
          },
          {
            "editType" : "add",
            "file" : "target/linux/microchipsw/patches-6.18/102-mmc-sdhci-of-at91-add-LAN969x-support.patch"
          },
          {
            "editType" : "add",
            "file" : "target/linux/microchipsw/patches-6.18/100-mmc-sdhci-of-at91-disable-selectively-clocks-on-pm-r.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/microchipsw/patches-6.18/103-arm64-dts-microchip-ev23x71a-enable-eMMC.patch"
          },
          {
            "editType" : "add",
            "file" : "target/linux/microchipsw/patches-6.18/101-dt-bindings-mmc-atmel-sama5d2-sdhci-add-LAN969x-comp.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/microchipsw/patches-6.18/100-dt-bindings-mmc-atmel-sama5d2-sdhci-add-LAN969x-comp.patch"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/dts/rtl9303_horaco_zx-swtgw2c8f.dts"
        ],
        "commitId" : "b0a05388ed6e74c70241525192b5045f7a09e7e1",
        "timestamp" : 1790088470000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: fix Horaco ZX-SWTGW2C8F port status LEDs for 2.5G\u000a\u000aCorrected 2.5G port status LED operation\u000a\u000aSigned-off-by: DSP ALU32 <dspalu32@gmail.com>\u000aLink: https://github.com/openwrt/openwrt/pull/25291\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-09-22 16:47:50 +0200",
        "id" : "b0a05388ed6e74c70241525192b5045f7a09e7e1",
        "msg" : "realtek: fix Horaco ZX-SWTGW2C8F port status LEDs for 2.5G",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/dts/rtl9303_horaco_zx-swtgw2c8f.dts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/dts/rtl9303_horaco_zx-swtgw2c8f.dts"
        ],
        "commitId" : "45dc02ca085d552a3b95e763f8894e6e694bd0c3",
        "timestamp" : 1790088470000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: fix Horaco ZX-SWTGW2C8F sysupgrade: MTD partition rename\u000a\u000aCorrected name of 'firmware' MTD partition to fix sysupgrade (was 'runtime')\u000a\u000aSigned-off-by: DSP ALU32 <dspalu32@gmail.com>\u000aLink: https://github.com/openwrt/openwrt/pull/25291\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-09-22 16:47:50 +0200",
        "id" : "45dc02ca085d552a3b95e763f8894e6e694bd0c3",
        "msg" : "realtek: fix Horaco ZX-SWTGW2C8F sysupgrade: MTD partition rename",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/dts/rtl9303_horaco_zx-swtgw2c8f.dts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/dts/rtl9303_horaco_zx-swtgw2c8f.dts"
        ],
        "commitId" : "54937fe9d6420e390c23635bff0dea1c7a6a4da6",
        "timestamp" : 1790088470000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: add SFP thermal zone/sensors for Horaco ZX-SWTGW2C8F\u000a\u000aAdded SFP thermal zone, in line with other RTL9303 devices on OpenWrt\u000a\u000aSigned-off-by: DSP ALU32 <dspalu32@gmail.com>\u000aLink: https://github.com/openwrt/openwrt/pull/25291\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-09-22 16:47:50 +0200",
        "id" : "54937fe9d6420e390c23635bff0dea1c7a6a4da6",
        "msg" : "realtek: add SFP thermal zone/sensors for Horaco ZX-SWTGW2C8F",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/dts/rtl9303_horaco_zx-swtgw2c8f.dts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c"
        ],
        "commitId" : "f4cf59fe1c11823d211854d70eeb351e8345d5d5",
        "timestamp" : 1790088554000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: l3: do not queue FIB work for multicast routes\u000a\u000aThe FIB notifier lets the two multicast families through its filter, but\u000athe branch that fills the work item runs only for AF_INET. An entry\u000aevent from ipmr or ip6mr therefore queues a work item whose fib_info\u000apointer is still the zero kzalloc() left there, and the add handler the\u000aworker calls hands that NULL to fib_info_nh(), whose first act is to\u000aread fi->nh. The box oopses there and panics.\u000a\u000aThe events are real ones: mr_call_mfc_notifiers() sends ENTRY_ADD,\u000aENTRY_REPLACE and ENTRY_DEL down the same chain this driver registers\u000aon, once per multicast cache entry a routing daemon installs or removes.\u000a\u000aWhat it takes is a kernel built with multicast routing, a daemon that\u000ainstalls a cache entry, and a switch whose L3 setup is in place. The mfc\u000aadd and delete paths and mroute_clean_tables() emit these notifiers, in\u000aipmr and ip6mr alike, and mr_dump() replays every existing entry to a\u000anotifier that has just registered - so the driver can also meet one at\u000aits own probe, if a daemon installed it first. All of them start from\u000auserspace. CONFIG_IP_MROUTE and CONFIG_IPV6_MROUTE are off in the generic\u000aconfig and no realtek subtarget turns them on, so a stock image never\u000agets there either.\u000a\u000aGiven both, no command and no route added by hand are needed: an\u000aRTL9303 with the offload compiled in and smcroute installed dies 58\u000aseconds into its first boot, as the daemon opens its interfaces during\u000athe ordinary network bring-up.\u000a\u000aMeasured the other way round as well: an image built the same way and\u000adiffering by this commit and one unrelated L3 fix runs on, 273 seconds\u000aagainst a 58 second failure window, with nothing in the log. The RTL839x\u000acarries its L3 setup outside any config symbol, so a build of that\u000afamily with multicast routing on is enough as well; the RTL930x\u000aadditionally needs the offload symbol, which no subtarget config sets.\u000a\u000aTake only the two families the driver decodes.\u000a\u000aAssisted-by: Claude:claude-opus-5\u000aSigned-off-by: Gennaro Cimmino <gcimmino@rayonra.net>\u000aLink: https://github.com/openwrt/openwrt/pull/25309\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-09-22 16:49:14 +0200",
        "id" : "f4cf59fe1c11823d211854d70eeb351e8345d5d5",
        "msg" : "realtek: l3: do not queue FIB work for multicast routes",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl931x.c",
          "target/linux/realtek/files-6.18/include/linux/soc/realtek/otto_table.h"
        ],
        "commitId" : "6b46fe37b517946906b93b9428ae0fc592f4f195",
        "timestamp" : 1790091563000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: soc: define a macro for table reads with non zero word offset\u000a\u000aThe RTL931X utilizes the otto_table_read_bytes function in its DSA driver\u000aas it needs field and mib offsets for stat reading.\u000a\u000aThis can be replaced by a proper otto_table_offset_read macro which takes\u000a4th variable as a word offset for otto_table_read_bytes.\u000a\u000aSigned-off-by: Rustam Adilov <adilov@tutamail.com>\u000aLink: https://github.com/openwrt/openwrt/pull/25136\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-09-22 17:39:23 +0200",
        "id" : "6b46fe37b517946906b93b9428ae0fc592f4f195",
        "msg" : "realtek: soc: define a macro for table reads with non zero word offset",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl931x.c"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/include/linux/soc/realtek/otto_table.h"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c"
        ],
        "commitId" : "3ac6d739fa3a284c0b0377b47b0b005beb62abc0",
        "timestamp" : 1790091564000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: soc: split addr to ctrl/sts and data to read/write\u000a\u000aIn preparation for upcoming support of RTL9607C split the addr and\u000adata properties of otto_table struct into control address, status\u000aaddress and write and read data windows.\u000a\u000aSigned-off-by: Rustam Adilov <adilov@tutamail.com>\u000aLink: https://github.com/openwrt/openwrt/pull/25136\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-09-22 17:39:24 +0200",
        "id" : "3ac6d739fa3a284c0b0377b47b0b005beb62abc0",
        "msg" : "realtek: soc: split addr to ctrl/sts and data to read/write",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c"
        ],
        "commitId" : "188f5ef394c7e78bf98c914326d83c93c938c7d9",
        "timestamp" : 1790091564000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: soc: add busy status bit property\u000a\u000aThe TBL_ACCESS_CTRL register of RTL9607C does not have an execute\u000abit and thus relies on a separate busy bit in its TBL_ACCESS_STS\u000aregister. Add a busy bit with -1 describing the lack of that bit\u000ain the table registers.\u000a\u000aSigned-off-by: Rustam Adilov <adilov@tutamail.com>\u000aLink: https://github.com/openwrt/openwrt/pull/25136\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-09-22 17:39:24 +0200",
        "id" : "188f5ef394c7e78bf98c914326d83c93c938c7d9",
        "msg" : "realtek: soc: add busy status bit property",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c"
        ],
        "commitId" : "bdc34d92af2b0589406325a6f6572486f5e54d99",
        "timestamp" : 1790091564000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: soc: add addr lsb and addr msb properties to table struct\u000a\u000aThe address bit field of TBL_ACCESS_CTRL register on RTL9607C is not located\u000aat 0 lsb. Introduce new addr lsb and addr msb properties to otto_table struct.\u000aThis also accidentally fixes the address mask of OTTO_REG_9300_L2 table as the\u000a\"BIT(t_bit) - 1\" would result in an extra 2 bits.\u000a\u000aSigned-off-by: Rustam Adilov <adilov@tutamail.com>\u000aLink: https://github.com/openwrt/openwrt/pull/25136\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-09-22 17:39:24 +0200",
        "id" : "bdc34d92af2b0589406325a6f6572486f5e54d99",
        "msg" : "realtek: soc: add addr lsb and addr msb properties to table struct",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c"
        ],
        "commitId" : "a74fa4bf4dd60243fe4e81c76b57c3813ae168e7",
        "timestamp" : 1790091564000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: soc: add read/write execute bits\u000a\u000aThe RTL9607C NAT_TBL_ACCESS_CTRL register has 2 split execute bits for read and\u000awrite operations and thus does not have command bit. Add the read/write execute\u000abit to otto_table struct and change c_bit to signed where -1 is unused to make\u000aNAT_TBL_ACCESS_CTRL work.\u000a\u000aSigned-off-by: Rustam Adilov <adilov@tutamail.com>\u000aLink: https://github.com/openwrt/openwrt/pull/25136\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-09-22 17:39:24 +0200",
        "id" : "a74fa4bf4dd60243fe4e81c76b57c3813ae168e7",
        "msg" : "realtek: soc: add read/write execute bits",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c"
        ],
        "commitId" : "070ed83c88f209a7b3e27c2ee2a7e7eaaace3ac8",
        "timestamp" : 1790091564000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: soc: add m_bit and hit_bit properties\u000a\u000aThe RTL9607C has access method bit field that is used as a look-up\u000amethod for read queries of L2 tables and hit bit for whether or not\u000athe table query found an entry. It is exactly the same as how L2\u000atables are interfaced on RTL8365MB switch as per rtl8365mb_table in\u000aits DSA driver.\u000a\u000aFor now only the otto_table sruct is changed for description purposes\u000awithout adding the functionality.\u000a\u000aSigned-off-by: Rustam Adilov <adilov@tutamail.com>\u000aLink: https://github.com/openwrt/openwrt/pull/25136\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-09-22 17:39:24 +0200",
        "id" : "070ed83c88f209a7b3e27c2ee2a7e7eaaace3ac8",
        "msg" : "realtek: soc: add m_bit and hit_bit properties",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c",
          "target/linux/realtek/files-6.18/include/linux/soc/realtek/otto_table.h"
        ],
        "commitId" : "1a881f81d088b4fbabcd4db4bd79cdb6cdf12ad9",
        "timestamp" : 1790091564000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: soc: add offset parameter to otto_table_map\u000a\u000aAdd the offset parameter to otto_table_map struct since some RTL9607C tables\u000alike ACL_DATA and CF_RULE_T* require addition of an offset to their index to\u000adifferentiate from their MASK table counterpart.\u000a\u000aSigned-off-by: Rustam Adilov <adilov@tutamail.com>\u000aLink: https://github.com/openwrt/openwrt/pull/25136\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-09-22 17:39:24 +0200",
        "id" : "1a881f81d088b4fbabcd4db4bd79cdb6cdf12ad9",
        "msg" : "realtek: soc: add offset parameter to otto_table_map",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/include/linux/soc/realtek/otto_table.h"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c",
          "target/linux/realtek/files-6.18/include/linux/soc/realtek/otto_table.h"
        ],
        "commitId" : "07a2f397383799cc0acc73bec3a61eceff83262e",
        "timestamp" : 1790091564000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: soc: add support for RTL9607C Tables\u000a\u000aThe RTL9607C SoC is another Otto family member with very identical indirect\u000atable access as the rest of existing switch SoCs. It has two registers that\u000acontrol tables: TBL_ACCESS_CTRL for LUT, VLAN, ACL and Classification tables\u000aand NAT_TBL_ACCESS_CTRL for HWNAT related tables.\u000a\u000aAdd these two main control registers to OTTO_REG_LIST and all of their tables\u000ato otto_table_maps and otto_table_id in header file.\u000a\u000aSigned-off-by: Rustam Adilov <adilov@tutamail.com>\u000aLink: https://github.com/openwrt/openwrt/pull/25136\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-09-22 17:39:24 +0200",
        "id" : "07a2f397383799cc0acc73bec3a61eceff83262e",
        "msg" : "realtek: soc: add support for RTL9607C Tables",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/include/linux/soc/realtek/otto_table.h"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/soc/realtek/otto_table.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "scripts/download.pl"
        ],
        "commitId" : "ffef939ec42a94d5f31018f876515c00b1ae5dc9",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "scripts/download.pl: delete local file with hash mismatch\u000a\u000aThe unlink of a local file with a hash mismatch comes after the die,\u000aso it never runs. The message says that the file is deleted, but it\u000astays, and every following build fails in the same way.\u000a\u000aDelete the file before the die, so that the next run downloads it\u000aagain.\u000a\u000aFixes: 4e19cbc553 (\"download: handle possibly invalid local tarballs\")\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "ffef939ec42a94d5f31018f876515c00b1ae5dc9",
        "msg" : "scripts/download.pl: delete local file with hash mismatch",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "scripts/download.pl"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/boot/uboot-mediatek/Makefile"
        ],
        "commitId" : "468176411cb819cf6c5b09d3383e91cded6622ce",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "uboot-mediatek: rebuild the fip if BL31 changed\u000a\u000aThe fip contains BL31 from trusted-firmware-a, but the U-Boot build does\u000anot depend on it. After a rebuild of trusted-firmware-a, the fip and the\u000aimages that contain it keep the old BL31.\u000a\u000aMake the build stamp depend on the BL31 image.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "468176411cb819cf6c5b09d3383e91cded6622ce",
        "msg" : "uboot-mediatek: rebuild the fip if BL31 changed",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/boot/uboot-mediatek/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/package.mk"
        ],
        "commitId" : "a0e191667cac3447017c29fd76cad6843b045b58",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: exclude apk staging dirs from the autorebuild check\u000a\u000aThe rdep check on PKG_BUILD_DIR excludes the ipkg-* staging dirs, but\u000anot the apk-* ones. The package step writes the apk scripts after\u000a.built is touched. If this crosses a second boundary, the next build\u000asees newer files and packs the package again, which starts the loop\u000aagain. The kernel package with its kmods takes several seconds to pack\u000aand is repacked on every build.\u000a\u000aAnchor the pattern to PKG_BUILD_DIR, as a plain \"*/apk-*\" also matches\u000athe build dir of the apk package itself.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "a0e191667cac3447017c29fd76cad6843b045b58",
        "msg" : "build: exclude apk staging dirs from the autorebuild check",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/package.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "scripts/package-metadata.pl"
        ],
        "commitId" : "f8471d798ec7694a477b7605bbeb5dcb7e9b5256",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "scripts/package-metadata.pl: keep the depends of real packages\u000a\u000apkgaux writes Package/<name>/depends for every name that a package\u000aprovides. If a package provides the name of another real package, it\u000aoverwrites the dependencies of that package: dnsmasq-full provides\u000adnsmasq, so dnsmasq gets the dependencies of dnsmasq-full, among them\u000anftables-json and libnftnl.\u000a\u000aThese lists are used for the library dependencies of the prepare\u000astamp. dnsmasq thus depends on libnftnl without being ordered after it,\u000aand is built again in the build that follows a clean build.\u000a\u000aSkip provided names that belong to another real package.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "f8471d798ec7694a477b7605bbeb5dcb7e9b5256",
        "msg" : "scripts/package-metadata.pl: keep the depends of real packages",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "scripts/package-metadata.pl"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/package.mk"
        ],
        "commitId" : "be3937dfbc341085a423d9518cfaf63c4d347235",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: only track library dependencies of selected packages\u000a\u000aThe prepare stamp of a Makefile depends on the library version files\u000aof every package it defines, selected or not. Packages that are not\u000aselected are not in the dependency graph of the top-level build, so\u000atheir libraries can be built after the package in a parallel build,\u000aand the package is prepared and built again on the next run.\u000a\u000aThe own packages of a Makefile are only filtered out if they are\u000adefined before the packages that depend on them. mac80211 defines\u000acfg80211 and mac80211 after the drivers, so it depends on its own\u000aversion files, and every clean build is followed by a rebuild of\u000amac80211, mt76 and linux-firmware.\u000a\u000aOnly add the library dependencies of selected packages, or of all\u000apackages if DEVELOPER is set.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "be3937dfbc341085a423d9518cfaf63c4d347235",
        "msg" : "build: only track library dependencies of selected packages",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/package.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "scripts/package-metadata.pl"
        ],
        "commitId" : "4547335cc7d17bc6c0ab168e0d570fb479ae0ea1",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "scripts/package-metadata.pl: keep the condition of package depends\u000a\u000agen_package_auxiliary drops the condition of a dependency such as\u000a+BUILD_NLS:libintl-full, so the ABI version check of a package also\u000acounts packages that it does not depend on in this configuration.\u000a\u000aWith all packages selected and BUILD_NLS not set, libelf depends on\u000alibintl-full. gettext-full is built after elfutils, and its new\u000alibintl-full.version causes elfutils, and binutils, gdb, strace,\u000aiproute2 and others through it, to be built again on the next make\u000acall.\u000a\u000aWrite the condition as a make expression with get_conditional_dep, as\u000agen_package_mk does.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "4547335cc7d17bc6c0ab168e0d570fb479ae0ea1",
        "msg" : "scripts/package-metadata.pl: keep the condition of package depends",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "scripts/package-metadata.pl"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "scripts/package-metadata.pl"
        ],
        "commitId" : "d0379f4a5a3c4e9b535727711b76f8457dbc9c48",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "scripts/package-metadata.pl: list every build variant only once\u000a\u000aIf several packages of a source use the same build variant, the\u000avariant is added to the list of variants once for each selected\u000apackage, and the variant is built as often, one after the other. With\u000aall packages selected, hostapd builds 4 variants twice, and f2fs-tools\u000aits 2 variants four times each.\u000a\u000aAdd each variant once, with the condition of all packages that use it.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "d0379f4a5a3c4e9b535727711b76f8457dbc9c48",
        "msg" : "scripts/package-metadata.pl: list every build variant only once",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "scripts/package-metadata.pl"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/subdir.mk"
        ],
        "commitId" : "39ed48c8f12eec91d5bf39d37ca666b6a937cc87",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: clean all stamps of a subdir\u000a\u000astampfile assigns the clean rule of its stamp to <subdir>//clean with\u000a:=, so every call replaces the one before. toolchain and tools define\u000aa compile and a check stamp, and <subdir>/clean only removes the check\u000astamp. After \"make toolchain/clean\", the compile stamp is newer than the\u000atoolchain sources, the next build takes the toolchain as built, and the\u000atarget build fails because the compiler is missing.\u000a\u000aAppend the clean rule instead, so that all stamps are removed.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "39ed48c8f12eec91d5bf39d37ca666b6a937cc87",
        "msg" : "build: clean all stamps of a subdir",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/subdir.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/subdir.mk"
        ],
        "commitId" : "1315d219498e25e9cfe3c9666855b71fa4013cdb",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: log failed host builds in the error file of the subdir\u000a\u000aCommit 501123eb7a (\"include/subdir: on build failure always print\u000aerror\") passes $(2) instead of $(1) to ERROR for the builds of a build\u000atype, such as host builds. subdir has no second parameter, so with\u000aBUILD_LOG set a failed host build is written to logs/error.txt instead\u000aof logs/package/error.txt, where the other errors of the subdir go.\u000a\u000aFixes: 501123eb7a (\"include/subdir: on build failure always print error\")\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "1315d219498e25e9cfe3c9666855b71fa4013cdb",
        "msg" : "build: log failed host builds in the error file of the subdir",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/subdir.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "rules.mk"
        ],
        "commitId" : "83b7310eb3897afa20d8bbddd59638b2614b3f73",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: do not share a file for the 64-bit time_t test\u000a\u000aYEAR_2038 writes its test program to $(TMP_DIR)/year2038.c and deletes\u000ait after the test. Packages that are built in parallel run the test at\u000athe same time and use the same file, so one of them can compile a\u000apartly written file or find no file. The test then fails, and the host\u000abuild is configured with --disable-year2038.\u000a\u000aPass the test program to the compiler on stdin instead.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "83b7310eb3897afa20d8bbddd59638b2614b3f73",
        "msg" : "build: do not share a file for the 64-bit time_t test",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "rules.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/depends.mk"
        ],
        "commitId" : "5433adbc6e53ea21b235d391240b716603986b5e",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: sort the file list for the stamp hash in the C locale\u000a\u000afind_md5 sorts the list of package files with the locale of the user.\u000aThe top-level Makefile sets LC_ALL=C, but a make call in a package\u000adirectory, such as make -C package/kernel/linux, uses the locale of\u000athe shell. With en_GB.UTF-8, some file names sort in a different\u000aorder, so the hash and the name of the prepared stamp differ, and the\u000apackage is built again. The next top-level build then builds it again.\u000a\u000aAlways sort in the C locale.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "5433adbc6e53ea21b235d391240b716603986b5e",
        "msg" : "build: sort the file list for the stamp hash in the C locale",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/depends.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/network/utils/xdp-tools/Makefile",
          "package/network/utils/xdp-tools/patches/0004-configure-do-not-use-bash-redirection.patch"
        ],
        "commitId" : "111e92cce05f7e32996b7f0dd56d42e2d86e61ee",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "xdp-tools: find the arch headers of the toolchain for the BPF programs\u000a\u000aThe configure script of xdp-tools sets ARCH_INCLUDES only from the\u000amultiarch directory of a native compiler. For a cross compiler it stays\u000aempty, and clang takes <linux/types.h> for the BPF programs from\u000a/usr/include of the host. On hosts that have <asm/types.h> only in the\u000amultiarch directory, such as Debian without gcc-multilib, the build\u000afails:\u000a\u000a  /usr/include/linux/types.h:5:10: fatal error: 'asm/types.h' file not found\u000a\u000aAdd the include directories of the toolchain with -idirafter. They are\u000asearched after the headers of xdp-tools and of the system, as the\u000amultiarch directory of a native build, so they do not replace the Linux\u000aheaders that xdp-tools ships. The target compiler already has them as\u000asystem directories.\u000a\u000aThe configure script also tests for bpftool with the bash redirection &>.\u000a/bin/sh may be dash, which runs the command in the background instead, so\u000aconfigure drops a working bpftool and takes the output of whereis. Add a\u000asecond patch that uses >/dev/null 2>&1, which every shell supports.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "111e92cce05f7e32996b7f0dd56d42e2d86e61ee",
        "msg" : "xdp-tools: find the arch headers of the toolchain for the BPF programs",
        "paths" : [
          {
            "editType" : "add",
            "file" : "package/network/utils/xdp-tools/patches/0004-configure-do-not-use-bash-redirection.patch"
          },
          {
            "editType" : "edit",
            "file" : "package/network/utils/xdp-tools/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/boot/uboot-tools/uboot-envtools/files/uboot-envtools.sh"
        ],
        "commitId" : "bda729e82f200b3c338ac313c70e616285e4872e",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "uboot-envtools: remove stray output from the boot log\u000a\u000a/etc/uci-defaults/30_uboot-envtools runs in preinit, before the board\u000afile is generated. Two of its helpers write to the console:\u000a\u000a* uci batch prints the name of every anonymous section that \"add\"\u000a  creates, and nothing redirects stdout.\u000a* grep -q hides a match, but it still reports a file that does not\u000a  exist. /etc/fw_env.config is absent until the first append creates it.\u000a\u000aOn the first boot after a flash this puts three lines on the console:\u000a\u000a    cfg016cb7\u000a    cfg026cb7\u000a    grep: /etc/fw_env.config: No such file or directory\u000a\u000aRedirect the batch output and add -s to the grep.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "bda729e82f200b3c338ac313c70e616285e4872e",
        "msg" : "uboot-envtools: remove stray output from the boot log",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/boot/uboot-tools/uboot-envtools/files/uboot-envtools.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/kernel/lantiq/ltq-ifxos/Makefile",
          "package/kernel/lantiq/ltq-adsl-mei/Makefile",
          "package/kernel/lantiq/ltq-deu/Makefile"
        ],
        "commitId" : "fbd3048f21857c53416a42181a6e9ababba4a716",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "lantiq: pass the kernel make flags to three module packages\u000a\u000altq-adsl-mei and ltq-deu call make directly after a cd into the kernel\u000adirectory, and ltq-ifxos builds its module through autotools. None of them\u000apass KERNEL_MAKE_FLAGS, so the module compile runs without the\u000a-ffile-prefix-map that iremap adds. WARN_ON_ONCE() in check_copy_size()\u000aexpands to warn_slowpath_fmt(__FILE__, ...), so the absolute build path\u000alands in the .ko.\u000a\u000aMeasured on the published snapshot packages of lantiq/xway and\u000axrx200_legacy:\u000a- drv_mei_cpe.ko holds\u000a  /builder/shared-workdir/build/build_dir/target-mips_24kc_musl/linux-lantiq_xway/linux-6.18.52/include/linux/ucopysize.h\u000a- drv_ifxos.ko holds the same path for linux-lantiq_xrx200_legacy\u000a- ltq_atm_danube.ko, built with the flags, holds no such string\u000a\u000aThe module size follows the length of the build path, so the apk record\u000aand every image that carries the module differ between two builds in\u000adifferent directories.\u000a\u000altq_deu_vr9.ko holds no such string today, but the package has the same\u000adefect.\u000a\u000aPass the flags in the same way as ltq-atm and ltq-vdsl-vr9-mei already do.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "fbd3048f21857c53416a42181a6e9ababba4a716",
        "msg" : "lantiq: pass the kernel make flags to three module packages",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/kernel/lantiq/ltq-adsl-mei/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "package/kernel/lantiq/ltq-deu/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "package/kernel/lantiq/ltq-ifxos/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/package.mk"
        ],
        "commitId" : "728fb15aff43e37aa3be02fb3d97277f825b504b",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: use a separate staging directory per build variant\u000a\u000aAll variants of a package collect their InstallDev files in the same\u000adirectory below $(TMP_DIR) and remove it before and after use. Add the\u000abuild variant to its name, as for the staging file list, so that the\u000avariants of a package do not share it.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "728fb15aff43e37aa3be02fb3d97277f825b504b",
        "msg" : "build: use a separate staging directory per build variant",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/package.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/boot/uboot-mediatek/Makefile"
        ],
        "commitId" : "df6a1c978bda765bf684b6b7fb76ad100328ea2a",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "uboot-mediatek: compress BL31 in the build directory\u000a\u000aWith FIP_COMPRESS set, the fip step compresses the BL31 image next to\u000athe original in the staging directory. All U-Boot variants for the same\u000aSoC, boot device and DRAM type write the same file.\u000a\u000aWrite the compressed BL31 to the build directory of the variant instead.\u000aThe fip does not change.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "df6a1c978bda765bf684b6b7fb76ad100328ea2a",
        "msg" : "uboot-mediatek: compress BL31 in the build directory",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/boot/uboot-mediatek/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/package-dumpinfo.mk",
          "scripts/metadata.pm",
          "include/subdir.mk",
          "scripts/package-metadata.pl"
        ],
        "commitId" : "2d40469602c0152ac17e23ca72b4f4ace32fa11a",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: allow packages to build their variants in parallel\u000a\u000aThe variants of a package are built one after the other in one recipe.\u000aFor packages with many variants, such as the boot loaders, this makes\u000athe variants the longest chain of the package build, also if nothing\u000ahas to be done.\u000a\u000aAdd PKG_PARALLEL_VARIANTS. If a package sets it, every variant gets its\u000aown make target with the dependencies of the package, and the package\u000atarget depends on these targets. A package must only set it if its\u000avariants share no files outside of their build directories.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "2d40469602c0152ac17e23ca72b4f4ace32fa11a",
        "msg" : "build: allow packages to build their variants in parallel",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/package-dumpinfo.mk"
          },
          {
            "editType" : "edit",
            "file" : "scripts/metadata.pm"
          },
          {
            "editType" : "edit",
            "file" : "include/subdir.mk"
          },
          {
            "editType" : "edit",
            "file" : "scripts/package-metadata.pl"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/boot/arm-trusted-firmware-mediatek/Makefile",
          "package/boot/uboot-mediatek/Makefile"
        ],
        "commitId" : "b8d89de6e07934e9264d4c2c6fef834be0a52f9e",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "mediatek: build the boot loader variants in parallel\u000a\u000aThe variants of arm-trusted-firmware-mediatek and uboot-mediatek only\u000awrite to their own build directories and to files in the staging and\u000abin directories that have the variant in their name.\u000a\u000aFor the OpenWrt One, a clean build of the 9 TF-A variants takes 2 s\u000ainstead of 11 s, and of the 2 U-Boot variants 12 s instead of 21 s.\u000aThe images do not change.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "b8d89de6e07934e9264d4c2c6fef834be0a52f9e",
        "msg" : "mediatek: build the boot loader variants in parallel",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/boot/uboot-mediatek/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "package/boot/arm-trusted-firmware-mediatek/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/network/services/hostapd/Makefile"
        ],
        "commitId" : "b029d56e0bd0c4e044c6e5d918e0da96223ab8da",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "hostapd: build the variants in parallel\u000a\u000aThe variants only write to their own build directories. The packages\u000awithout a variant are only built by the first variant.\u000a\u000aWith all packages selected, a clean build of the 31 variants takes 46 s\u000ainstead of 114 s, and the packages do not change. Together with the\u000acommit that lists every build variant only once, a build that has\u000anothing to do takes 17 s instead of 33 s, as the variants were the\u000alongest chain of it.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "b029d56e0bd0c4e044c6e5d918e0da96223ab8da",
        "msg" : "hostapd: build the variants in parallel",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/network/services/hostapd/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/libs/gettext-full/Makefile"
        ],
        "commitId" : "b8d8bb9ba3084a7c611f02e06f3cba4e6ba6bbb2",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "gettext-full: enable parallel builds again\u000a\u000aCommit 30fb675847 (\"gettext-full: disable parallel compilation\")\u000adisabled parallel builds of gettext 0.21, as they failed with make -j12.\u000a\u000aWith gettext 0.24.2, the host and the target build passed four times\u000aeach with make -j24, and libintl-full does not change. The host build\u000atakes 172 s instead of 231 s, and the target build 142 s instead of\u000a214 s. With all packages selected, both are on the longest chain of a\u000aclean build.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "b8d8bb9ba3084a7c611f02e06f3cba4e6ba6bbb2",
        "msg" : "gettext-full: enable parallel builds again",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/libs/gettext-full/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tools/mtd-utils/Makefile",
          "tools/erofs-utils/Makefile",
          "tools/cpio/Makefile"
        ],
        "commitId" : "3d597977b6616cc4206d5a95b134f13e581032b5",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "tools: build erofs-utils, mtd-utils and cpio in parallel\u000a\u000aA tool builds with -j1 unless it sets HOST_BUILD_PARALLEL, and 45 of the\u000a73 tools do not set it. These three gain the most from the job server on\u000aa cold build of this tree:\u000a\u000a  erofs-utils  23.11 s -> 15.73 s\u000a  mtd-utils    11.70 s ->  6.42 s\u000a  cpio          8.46 s ->  3.56 s\u000a\u000aEach one builds three times out of three with the job server, and each\u000abuild writes a tree that is identical to the one a serial build writes.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "3d597977b6616cc4206d5a95b134f13e581032b5",
        "msg" : "tools: build erofs-utils, mtd-utils and cpio in parallel",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tools/mtd-utils/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/cpio/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/erofs-utils/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/utils/mtd-utils/Makefile",
          "package/libs/libsepol/Makefile",
          "package/libs/libselinux/Makefile"
        ],
        "commitId" : "bb332115ba1db784b05eabf258ab407aeff7f00e",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "package: build mtd-utils, libsepol and libselinux in parallel\u000a\u000aA package builds with -j1 unless it sets PKG_BUILD_PARALLEL, and 171 of\u000athe 220 packages do not set it. These three gain the most from the job\u000aserver on a cold build of this tree:\u000a\u000a  mtd-utils   24.77 s -> 6.43 s\u000a  libsepol    17.99 s -> 2.18 s\u000a  libselinux   7.82 s -> 1.89 s\u000a\u000amtd-utils runs while nothing else does, so its 18 s count against the\u000awall clock in full.\u000a\u000aEach one builds three times out of three with the job server, and each\u000abuild writes a tree that is identical to the one a serial build writes.\u000anftables gains as well, 17.9 s to 13.0 s, but it is left alone: its\u000abuild directory differs between two serial builds, so the check that\u000acovers the other three says nothing about it.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "bb332115ba1db784b05eabf258ab407aeff7f00e",
        "msg" : "package: build mtd-utils, libsepol and libselinux in parallel",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/utils/mtd-utils/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "package/libs/libsepol/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "package/libs/libselinux/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/kernel.mk"
        ],
        "commitId" : "a15df1972728e44802d78a8694915527966ea624",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "kernel: filter versioned kmod items in make\u000a\u000aversion_filter calls package-metadata.pl for every list that contains\u000aa versioned item such as \"foo@ge6.18\". Parsing package/kernel/linux\u000aruns it about 40 times, which takes 1.3 s of 2.2 s, and this parse is\u000aon the critical path of every build.\u000a\u000aFilter items of the form <name>@<op><version> in make. The version\u000acomparison stays in package-metadata.pl, but runs only once per\u000aversion. Other forms are passed to package-metadata.pl as before.\u000a\u000aThe only difference in the output: items without a version condition\u000aare no longer passed through the shell, so quotes in a KCONFIG value\u000aare kept. That list is only used for variable names, so the result is\u000athe same. All kmod packages and images are identical.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "a15df1972728e44802d78a8694915527966ea624",
        "msg" : "kernel: filter versioned kmod items in make",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/kernel.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "rules.mk"
        ],
        "commitId" : "d29ffc6f39c383b9fc3e15b52837488c6d556a12",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: evaluate NPROC only once\u000a\u000aNPROC is a recursive variable, so every use starts a shell. The image\u000aMakefile expands the initramfs rule once per device, which runs nproc\u000aabout 200 times and makes the parse of the mediatek image Makefile take\u000aabout 1 s. It is parsed twice per build.\u000a\u000aEvaluate it on first use and keep the result.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "d29ffc6f39c383b9fc3e15b52837488c6d556a12",
        "msg" : "build: evaluate NPROC only once",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "rules.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/toplevel.mk"
        ],
        "commitId" : "177325ba1a7860994aea060d861e1513ea91c5b4",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: compute REVISION and SOURCE_DATE_EPOCH once per build\u000a\u000aThe top-level Makefile calls itself for prereq and for the build, and\u000aevery call runs getver.sh and get_source_date_epoch.sh again, although\u000athe values are already exported by the first call.\u000a\u000aTake them from the environment in recursive calls. The first call still\u000acomputes them, so a value in the environment of the user is ignored as\u000abefore.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "177325ba1a7860994aea060d861e1513ea91c5b4",
        "msg" : "build: compute REVISION and SOURCE_DATE_EPOCH once per build",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/toplevel.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/toplevel.mk"
        ],
        "commitId" : "e3a89c4e4bcd25158690408cfc52886b4e67e602",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: detect the host triplet once per build\u000a\u000aThe top-level Makefile calls itself for prereq and for the build, and\u000aevery call runs config.guess again. config.guess runs the host C\u000acompiler three times, which takes about 40 ms.\u000a\u000aTake GNU_HOST_NAME from the environment in recursive calls, as for\u000aREVISION and SOURCE_DATE_EPOCH.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "e3a89c4e4bcd25158690408cfc52886b4e67e602",
        "msg" : "build: detect the host triplet once per build",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/toplevel.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/feeds.mk"
        ],
        "commitId" : "f5fb15d8698ffd2feff34d30842a619544450c38",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: list the available feeds only when needed\u000a\u000afeeds.mk runs \"scripts/feeds list -n\" when it is included, which\u000ahappens in every package Makefile. The list is only needed to find the\u000apackage directories of the feeds, which a package Makefile only does\u000awhen it creates or cleans a package.\u000a\u000aEvaluate FEEDS_AVAILABLE on first use.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "f5fb15d8698ffd2feff34d30842a619544450c38",
        "msg" : "build: list the available feeds only when needed",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/feeds.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "Makefile"
        ],
        "commitId" : "6b009ee3eafe1dd1651ef49eb73180e94a4ee3e9",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: create the index, image info and checksums in one make call\u000a\u000aworld runs package/index, json_overview_image_info and checksum as\u000athree separate calls of the top-level Makefile, and each call parses it\u000aagain. The calls run without -j, so one call with all three goals runs\u000athem in the same order.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "6b009ee3eafe1dd1651ef49eb73180e94a4ee3e9",
        "msg" : "build: create the index, image info and checksums in one make call",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/host-build.mk",
          "include/package.mk",
          "include/depends.mk"
        ],
        "commitId" : "842611776de08eaa24f1205a8bd7b93461667887",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: hash the package files only once per Makefile\u000a\u000aBuild/CoreTargets fixes the value of STAMP_PREPARED, but its expansion\u000areferences STAMP_PREPARED several times before that happens, and every\u000areference hashes all files of the package again with find and mkhash.\u000aHOST_STAMP_PREPARED carries the same hash and the same cost.\u000a\u000aCompute the hash on first use in PKG_FILES_MD5 and keep it. Both stamps\u000aread it.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "842611776de08eaa24f1205a8bd7b93461667887",
        "msg" : "build: hash the package files only once per Makefile",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/package.mk"
          },
          {
            "editType" : "edit",
            "file" : "include/host-build.mk"
          },
          {
            "editType" : "edit",
            "file" : "include/depends.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "rules.mk"
        ],
        "commitId" : "43a9ff1c9430cf64891bcfaea5cdbe437c9f28a7",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: compute the hash of a config symbol list only once\u000a\u000aconfvar runs a shell and mkhash every time make expands a stamp name that\u000acontains it, 21 times in a make call for a package with a host build,\u000aalso if nothing has to be done.\u000a\u000aThe config symbols do not change during a make call, so keep the hash\u000aof each list of symbols after the first use.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "43a9ff1c9430cf64891bcfaea5cdbe437c9f28a7",
        "msg" : "build: compute the hash of a config symbol list only once",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "rules.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/package.mk"
        ],
        "commitId" : "a44d3e32563168b9022f779f567456e6efdcb013",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: find the source date of a package only once per directory\u000a\u000aMake expands PKG_SOURCE_DATE_EPOCH for every recipe of a package, as\u000apackage-pack.mk exports it to the recipes. Every expansion runs\u000aget_source_date_epoch.sh, which runs git.\u000a\u000aKeep the result for each directory. The directory still depends on\u000awhether the build directory has a version.date file.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "a44d3e32563168b9022f779f567456e6efdcb013",
        "msg" : "build: find the source date of a package only once per directory",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/package.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/host-build.mk"
        ],
        "commitId" : "64acf8343569ebc221e6d209d4daf92e37af3f6a",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: test for 64-bit time_t only when a host build needs it\u000a\u000ahost-build.mk runs the YEAR_2038 compiler test while it parses, so every\u000apackage with a host build runs it on every make call, also for a target\u000abuild or a build that has nothing to do.\u000a\u000aAdd the result to HOST_CONFIGURE_ARGS without expanding it, so the test\u000aruns only when the host build is configured.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "64acf8343569ebc221e6d209d4daf92e37af3f6a",
        "msg" : "build: test for 64-bit time_t only when a host build needs it",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/host-build.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/package-pack.mk",
          "include/package.mk"
        ],
        "commitId" : "9772acb4f7cb5892b99ccaf034b61ab9c4fe9126",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: only define the clean rule for packages not selected\u000a\u000aBuildPackage expands the full BuildTarget/ipkg for every package in a\u000aMakefile, whether it is selected or not. package/kernel/linux defines\u000amore than 1000 kmods, and this takes about 0.9 s of its 1.2 s parse,\u000awhich is on the critical path of every build.\u000a\u000aMove the clean rule into BuildTarget/ipkg/disabled, and only expand it\u000afor packages that are not selected, unless DEVELOPER is set. The other\u000arules of such a package can not be reached, as its compile target only\u000adepends on them if the package is selected. Target types without a\u000adisabled variant are expanded as before.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "9772acb4f7cb5892b99ccaf034b61ab9c4fe9126",
        "msg" : "build: only define the clean rule for packages not selected",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/package-pack.mk"
          },
          {
            "editType" : "edit",
            "file" : "include/package.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/image.mk"
        ],
        "commitId" : "6258a11bacdb5840b40a7a35e7f60b8d68a6eaab",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "image: only define the rules of selected devices\u000a\u000aA target defines more than 100 devices, and the image Makefile\u000aexpands the kernel, image and artifact rules of every one of them. The\u000arules of a device that is not selected are only reachable through\u000ainstall-disabled and compile-disabled, so nothing uses them. The image\u000aMakefile is parsed twice per build, 0.3 s each for mediatek.\u000a\u000aOnly expand Device/Build for selected devices, and for all devices if\u000aCONFIG_IB is set, as the ImageBuilder compiles them all.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "6258a11bacdb5840b40a7a35e7f60b8d68a6eaab",
        "msg" : "image: only define the rules of selected devices",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/image.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/subdir.mk"
        ],
        "commitId" : "407e8331402f94e1eae5addda38fdf5a90afdcd6",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: expand the subdir recipes only when they run\u000a\u000asubdir expands the recipe of every target of every build directory when\u000ait creates the rules, although make runs only a few of them. The main\u000aMakefile creates these rules on every make call, and a build calls it\u000aseveral times in a row.\u000a\u000aPut only a call of the recipe into the rules, so that make expands it\u000awhen the recipe runs. The commands do not change. The parse of the main\u000aMakefile takes 0.10 s instead of 0.15 s, with 318 package directories.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "407e8331402f94e1eae5addda38fdf5a90afdcd6",
        "msg" : "build: expand the subdir recipes only when they run",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/subdir.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/subdir.mk"
        ],
        "commitId" : "bc96efb443fd683e02e2c3fc625f72ed55ecb8b0",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: find the alias of a build directory with notdir\u000a\u000asubdir calls diralias twice for every target of every build directory,\u000aand diralias splits the path into words twice to find its last\u000acomponent. This takes a quarter of the parse time of the main Makefile.\u000a\u000aUse notdir, which returns the same last component. The rules do not\u000achange.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "bc96efb443fd683e02e2c3fc625f72ed55ecb8b0",
        "msg" : "build: find the alias of a build directory with notdir",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/subdir.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/kernel-build.mk",
          "scripts/build-time-log.sh",
          "rules.mk",
          "scripts/build-time-report.pl",
          "include/host-build.mk",
          "include/package.mk"
        ],
        "commitId" : "b95b0928ac7135322dd3d42c19d489ede35bf121",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: add per stage build time profiling\u000a\u000aSet BUILD_TIME_LOG=<file> to record a begin and an end event for every\u000aprepare, configure, compile and install stage of every tool, toolchain\u000acomponent, kernel and package. scripts/build-time-report.pl turns the log\u000ainto a report.\u000a\u000aThe report divides each second of the build between the stages that run\u000ain it, so the numbers show which stages hold up the wall clock rather\u000athan which ones burn the most CPU. Nothing is recorded and no extra\u000aprocess runs when BUILD_TIME_LOG is unset.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "b95b0928ac7135322dd3d42c19d489ede35bf121",
        "msg" : "build: add per stage build time profiling",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/package.mk"
          },
          {
            "editType" : "edit",
            "file" : "include/kernel-build.mk"
          },
          {
            "editType" : "edit",
            "file" : "rules.mk"
          },
          {
            "editType" : "edit",
            "file" : "include/host-build.mk"
          },
          {
            "editType" : "add",
            "file" : "scripts/build-time-log.sh"
          },
          {
            "editType" : "add",
            "file" : "scripts/build-time-report.pl"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/kernel-defaults.mk"
        ],
        "commitId" : "714886f3e4f0d4f5eb8ec299edcfd137c409c8d0",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "kernel: build the separate initramfs kernel only once\u000a\u000aWith TARGET_ROOTFS_INITRAMFS_SEPARATE, the initramfs kernel differs\u000afrom the regular kernel only in CONFIG_RD_<ALGO>. Both are built in the\u000asame tree, so every build switches the kernel config twice and relinks\u000avmlinux twice, even if nothing changed.\u000a\u000aGive the regular kernel the same ramdisk support and use its image for\u000athe initramfs as is. The initramfs step now only creates the initrd.\u000aRemove the separate initramfs branches of Kernel/SetInitramfs, as it is\u000ano longer called in this mode.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "714886f3e4f0d4f5eb8ec299edcfd137c409c8d0",
        "msg" : "kernel: build the separate initramfs kernel only once",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/kernel-defaults.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/kernel-defaults.mk"
        ],
        "commitId" : "9d84fbff3670153e3ec8415304cdd376022ba163",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "kernel: skip kbuild if the kernel tree did not change\u000a\u000akbuild runs twice per build, for the modules and for the image, and\u000atakes about half a second each time even if there is nothing to do.\u000a\u000aStore a hash of the kbuild command line after a successful run, and\u000askip the next run if the hash is the same and no file in the kernel\u000atree or the toolchain is newer than the stamp. The OpenWrt files at the\u000atop of the kernel tree are ignored, apart from .config. Directories are\u000aignored, as kbuild changes them with temporary files, so a deleted file\u000aalone does not trigger a run.\u000a\u000aWith CONFIG_STRIP_KERNEL_EXPORTS the image link reads symtab.h, which\u000asits above the kernel tree and follows the modules of the packages. The\u000ascan of the image run names that file as well.\u000a\u000aThe workaround that deletes vmlinux now only runs together with kbuild.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "9d84fbff3670153e3ec8415304cdd376022ba163",
        "msg" : "kernel: skip kbuild if the kernel tree did not change",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/kernel-defaults.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/toplevel.mk"
        ],
        "commitId" : "cb18fbc331a45d999860b1f7f7b89d1b7e2dc5be",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: regenerate package metadata only after it changed\u000a\u000aprepare-tmpinfo runs on every build and calls package-metadata.pl\u000athree times, although tmp/.packageinfo usually did not change. It also\u000awrites tmp/.config-feeds.in on every build: the check against\u000atmp/.packageauxvars never passes, as that file is written again later\u000ain the same recipe.\u000a\u000aGenerate the package metadata files only if tmp/.packageinfo or the\u000ascripts are newer, and replace tmp/.config-feeds.in only if its content\u000achanged.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "cb18fbc331a45d999860b1f7f7b89d1b7e2dc5be",
        "msg" : "build: regenerate package metadata only after it changed",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/toplevel.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/toplevel.mk"
        ],
        "commitId" : "e7d105af30a79f55da5a41315943b2c1d12878f9",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: skip the .config sync check if nothing changed\u000a\u000aEvery build runs conf --defconfig on a copy of .config to warn if the\u000aconfiguration is out of sync. This takes about a second before the\u000abuild starts.\u000a\u000aSkip the check if the last one passed, and neither .config nor a\u000aKconfig file, the generated Kconfig files or conf changed since then.\u000aIf the check fails, it runs and warns again on every build, as before.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "e7d105af30a79f55da5a41315943b2c1d12878f9",
        "msg" : "build: skip the .config sync check if nothing changed",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/toplevel.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/Makefile"
        ],
        "commitId" : "bc2e85eb8df05e8e1e5a7542c243b33fcbbf6365",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: clean the package root dir only if the packages can have changed\u000a\u000aThe stamp of package/cleanup depends on tmp/.build, which is touched on\u000aevery make call, so every build deletes $(STAGING_DIR_ROOT) and every\u000apackage copies its files into it again, one after the other under a\u000alock. With all packages selected, this takes 5 s of a build that has\u000anothing to do, most of it in the 1102 kmods of package/kernel/linux.\u000a\u000aOnly clean it if .config, the package metadata or a file below package/\u000achanged since the last cleanup. An edit of the source in a build\u000adirectory alone does not clean it, so a file that such an edit removes\u000afrom a package stays until then. make package/cleanup cleans it at any\u000atime.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "bc2e85eb8df05e8e1e5a7542c243b33fcbbf6365",
        "msg" : "build: clean the package root dir only if the packages can have changed",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "scripts/timestamp.pl"
        ],
        "commitId" : "3cf47c5c17dc2ec3ecab578a1fd4d723bb6b3f9b",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: compare timestamps with a fraction of a second\u000a\u000atimestamp.pl decides whether a subdir has work to do. It scans the stamp\u000afile and the source directories, keeps the newest, and reports that the\u000awork is done when the newest one is the stamp. The scan reads the mtime\u000athrough the core stat of perl, which truncates it to whole seconds, and\u000athe comparison is strict with the stamp scanned first. Two files that\u000ashare a second therefore count as a tie, and a tie says that the work is\u000adone.\u000a\u000ainclude/subdir.mk touches tmp/.build at the start of a build and the\u000astamp of a subdir at the end, so the two land in the same second once a\u000abuild takes less than a second between them. The target install stamp is\u000athe last one of a build, roughly 0.4 s before the build ends, so it is\u000athe one that ties first: the next build then skips target/install and\u000aships the images of the previous build. Around one build in five was\u000aaffected once the build became fast enough.\u000a\u000aRead the mtime through Time::HiRes, which reports the fraction as well.\u000aTwo touches around a fork no longer share a timestamp. Keep the core\u000astat where the module is missing, which restores the old behaviour\u000arather than failing.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "3cf47c5c17dc2ec3ecab578a1fd4d723bb6b3f9b",
        "msg" : "build: compare timestamps with a fraction of a second",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "scripts/timestamp.pl"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/Makefile"
        ],
        "commitId" : "3054effc90f343ebd2c2eae9319de4b671052836",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: rebuild the package index only when a package changed\u000a\u000apackage/index runs apk mkndx and make-index-json.py over every package\u000aon each build, which takes 1.2 s of a no-op build of this tree with 1258\u000apackages. The result depends only on the package files.\u000a\u000aSkip the pass while packages.adb and index.json exist and no package\u000afile, and no directory, is newer than index.json. The directory covers a\u000apackage that was added or removed, because neither changes a file that\u000ais left. The comparison uses index.json rather than packages.adb,\u000abecause apk mkndx writes packages.adb through a rename, which sets the\u000amtime of the directory to that of the file it wrote. The directory would\u000athen tie with packages.adb and the skip would rest on the two comparing\u000aequal. index.json is written after it, so the directory is older.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "3054effc90f343ebd2c2eae9319de4b671052836",
        "msg" : "build: rebuild the package index only when a package changed",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "rules.mk"
        ],
        "commitId" : "d8442d2876d97ea4ef98c51c688af971e44e5788",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: write the checksum file only when a file changed\u000a\u000asha256sums hashes every file of a directory on each build. package/index\u000acalls it over the package output of this tree, which holds 1258 files,\u000aand spends 0.7 s of a no-op build on a file that does not change.\u000a\u000aSkip the pass while the file exists and nothing in the directory is\u000anewer than it.\u000a\u000aThe checksum target of a build calls sha256sums as well, but it keeps\u000awriting the file on every build. buildversion and feedsversion rewrite\u000aversion.buildinfo and feeds.buildinfo beside it without a guard, so the\u000adirectory always holds something newer. Only package/index gains here.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "d8442d2876d97ea4ef98c51c688af971e44e5788",
        "msg" : "build: write the checksum file only when a file changed",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "rules.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "Makefile"
        ],
        "commitId" : "af60df881d1e5e221ecdf1e64444366c9ae9f603",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: run diffconfig only when the configuration changed\u000a\u000adiffconfig.sh runs the configuration parser over the whole tree twice,\u000awhich takes 2 s of every build, and buildinfo runs it on each build.\u000aThe result depends only on .config and the Kconfig files.\u000a\u000aSkip it while neither is newer than the file it wrote last time.\u000ainclude/toplevel.mk guards the sync check of .config the same way.\u000a\u000aThis alone changes nothing on a parallel build, because buildinfo runs\u000abeside the compile stamps. It pays once the other phases become shorter.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "af60df881d1e5e221ecdf1e64444366c9ae9f603",
        "msg" : "build: run diffconfig only when the configuration changed",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/Makefile"
        ],
        "commitId" : "8d2564302560bea292ba4050df444404e32527ef",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: merge the packages only when the set of packages changed\u000a\u000apackage/merge deletes the symlink farm of every built package and creates\u000ait again on every build. package/merge-index then reads all of those\u000apackages to create the index. With two thousand packages both steps take a\u000athird of a second, and the cost grows with the size of the configuration.\u000a\u000aRecord the name, the size and the timestamp of every package file. Skip\u000aboth steps while that list is unchanged and the index is present. A rebuild\u000aof the symlinks drops the index, so merge-index creates it again.\u000a\u000aThis takes the time of package/install on an unchanged tree from 1.05 s to\u000a0.60 s for the OpenWrt One.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "8d2564302560bea292ba4050df444404e32527ef",
        "msg" : "build: merge the packages only when the set of packages changed",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/kernel-build.mk"
        ],
        "commitId" : "746c76168c231a3d5f4fb8de4727b8e11f0645b5",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: create the images only when an input changed\u000a\u000atarget/linux install runs the whole image build on every build. It creates\u000athe root file system image, the kernel images, the FIT containers and the\u000afactory images again, although the inputs are the same. This takes 0.7 s for\u000athe OpenWrt One and much more for a target with many devices.\u000a\u000aRecord a state after a successful image build:\u000a\u000a - a hash of the target directory, because the build normalises the\u000a   timestamps of the root file system and they cannot report a change,\u000a - the name and the size of every image in the output directory, so that a\u000a   deleted image brings the build back,\u000a - the name and the size of every file below json_info_files, because\u000a   image_prepare drops that directory and profiles.json comes from it.\u000a\u000aSkip the image build while the state is the same and no file of the kernel\u000abuild directory, the kernel tree, the image directory of the staging\u000adirectory, the host tools, the target directory of the tree, include,\u000ascripts or .config is newer than the state file.\u000a\u000aThis takes the time of target/linux install on an unchanged tree from 1.77 s\u000ato 1.33 s, and the time of a full no-op build from 4.11 s to 3.72 s for the\u000aOpenWrt One.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "746c76168c231a3d5f4fb8de4727b8e11f0645b5",
        "msg" : "build: create the images only when an input changed",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/kernel-build.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/kernel-build.mk"
        ],
        "commitId" : "e97e3f36bd5d48add83c5c7fba907600b12a653c",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "kernel: configure the kernel only when an input changed\u000a\u000aThe configure stage rewrites the kernel configuration on every build. It\u000aruns kconfig.pl twice and package-metadata.pl once, which takes an eighth of\u000aa second. target/compile and target/install both pay it.\u000a\u000aThe rule carries FORCE because the kernel configuration also depends on the\u000apackage metadata, which is not a prerequisite. Add a check file that the\u000arule creates only when the configure stage must run, and make the stamp\u000adepend on it. The check covers the kernel configuration files, .config, the\u000apackage metadata, the scripts that read them, the two build system files\u000athat hold the recipe, the target directory and the user headers.\u000a\u000aThis takes the time of target/linux install on an unchanged tree from 1.33 s\u000ato 1.15 s, and the time of a full no-op build from 3.68 s to 3.40 s for the\u000aOpenWrt One.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "e97e3f36bd5d48add83c5c7fba907600b12a653c",
        "msg" : "kernel: configure the kernel only when an input changed",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/kernel-build.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/toplevel.mk"
        ],
        "commitId" : "0e5a0bd5581a1360230759cd35623db1fd01f5be",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: scan the package and target metadata only after a change\u000a\u000aprepare-tmpinfo runs the metadata scan for the packages and for the targets\u000aon every build. Each run starts two more make processes and walks the whole\u000adirectory, which takes 0.15 s per scan even when it finds nothing to do.\u000a\u000aKeep a stamp per scan and skip the scan while no Makefile, no .mk file and\u000ano directory below the scanned tree is newer than the stamp, and while\u000ainclude, rules.mk and .config are unchanged as well.\u000a\u000apackage/kernel/linux reads target/linux/*/modules.mk through SCAN_DEPS, so\u000athe package scan watches those files although they sit in the target tree.\u000a\u000aThis takes the time of the prereq step from 0.45 s to 0.21 s, and the time\u000aof a full no-op build from 3.40 s to 3.25 s for the OpenWrt One.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "0e5a0bd5581a1360230759cd35623db1fd01f5be",
        "msg" : "build: scan the package and target metadata only after a change",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/toplevel.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "Makefile",
          "rules.mk"
        ],
        "commitId" : "ac4f1dd36ce8c3b3c06652780d86056d78efa642",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: write the build info files only when they change\u000a\u000abuildversion, feedsversion and json_overview_image_info rewrite\u000aversion.buildinfo, feeds.buildinfo and profiles.json on every build. The\u000acontent is the same, but the new timestamp makes the checksum step hash\u000aevery image again, which takes 0.18 s for the OpenWrt One and grows with the\u000anumber of devices.\u000a\u000aWrite the three files to the temporary directory and copy them over the\u000aresult of the last build only when the content differs.\u000a\u000aThis takes the time of the index, image info and checksum step from 0.36 s\u000ato 0.10 s, and the time of a full no-op build from 3.25 s to 3.00 s.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "ac4f1dd36ce8c3b3c06652780d86056d78efa642",
        "msg" : "build: write the build info files only when they change",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "Makefile"
          },
          {
            "editType" : "edit",
            "file" : "rules.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "scripts/timestamp.pl"
        ],
        "commitId" : "b5c4b58764f34556af41326cca6354bc723b1ba5",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: let find answer the rebuild question\u000a\u000aThe -n caller of timestamp.pl only needs to know whether the stamp is the\u000anewest file. The script reads the timestamp of every file to answer that,\u000awhich costs 0.09 s for the build directory of U-Boot with its 44000 files.\u000aThe rebuild check runs the script twice per package and per build.\u000a\u000aCollect the paths first, and for -n ask find for the first file that is\u000anewer than the stamp. find stops at that file, so the walk ends early when\u000athere is work to do. The other modes keep the old code, and so does -n with\u000a-follow, because find and the script treat a symbolic link to a file\u000adifferently there.\u000a\u000aThe check over the U-Boot build directory now takes 0.02 s. The result is\u000athe same for all 44 build directories of the OpenWrt One. The time of a full\u000ano-op build does not change on a machine with 24 cores, where the package\u000astep waits for the dependency chain rather than for the checks.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "b5c4b58764f34556af41326cca6354bc723b1ba5",
        "msg" : "build: let find answer the rebuild question",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "scripts/timestamp.pl"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/download.mk"
        ],
        "commitId" : "f7adeacb6265eb7236d15dec831b1b7f1bd880e4",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: hash downloaded files only after they changed\u000a\u000acheck_download_integrity hashes the downloaded file on every parse of\u000aevery Makefile that uses it. With large archives this costs seconds per\u000abuild, for example about 1.2 s for linux-firmware, which is on the\u000acritical path of the package build.\u000a\u000aRemember the identity (inode, size, mtime, ctime) of a file that\u000amatched its expected hash, and hash it again only after it changed.\u000a\u000aThe identity comes from the stat of tools/coreutils, which a Linux host\u000adoes not build. Fall back to the stat of the host, and drop the cache\u000awhen neither one answers, so that a missing stat costs time and never\u000atrust.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "f7adeacb6265eb7236d15dec831b1b7f1bd880e4",
        "msg" : "build: hash downloaded files only after they changed",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/download.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/image-commands.mk",
          "include/kernel-defaults.mk",
          "scripts/cache-run.sh",
          "rules.mk"
        ],
        "commitId" : "c6a1bf59665544d6f8e2718006e2c39385584cea",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: reuse the output of slow compression steps\u000a\u000aOn a rebuild, the initrd and the initramfs kernel image usually have\u000athe same content as before, but xz and lzma compress them again on\u000aevery build. For the OpenWrt One this takes about 6 s of the build.\u000a\u000aAdd scripts/cache-run.sh. It runs a command that creates one file from\u000aanother, and stores the output together with a hash of the input, the\u000acommand line and the tool. If they are the same in the next run, it\u000acopies the stored output instead. The commands are deterministic, so\u000athe result is identical.\u000a\u000aOn a hit the script compares the stored output with the file that is\u000aalready there and copies only when the two differ. The output then keeps\u000aits timestamp, so a later step that compares timestamps does not treat it\u000aas new work.\u000a\u000aUse it for the initrd compression and for Build/lzma. bzip2 and lzop\u000astay as they are: bzip2 writes to stdout, and lzop stores the mtime of\u000aits input. xz and gzip now keep the cpio, as the other tools do, so a\u000acache hit leaves the same files behind as a normal run.\u000a\u000aThe slot name follows the path of the output below $(KDIR), because two\u000atargets in different directories can share a basename. cache-run.sh holds\u000aa lock over the slot and swaps the stored output in with a rename, so two\u000aimage recipes on one slot never read a half written pair.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "c6a1bf59665544d6f8e2718006e2c39385584cea",
        "msg" : "build: reuse the output of slow compression steps",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "rules.mk"
          },
          {
            "editType" : "add",
            "file" : "scripts/cache-run.sh"
          },
          {
            "editType" : "edit",
            "file" : "include/image-commands.mk"
          },
          {
            "editType" : "edit",
            "file" : "include/kernel-defaults.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/image-commands.mk"
        ],
        "commitId" : "5b3be62345bde6ecabb1869a8a9a86abd1316c23",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: reuse the output of Build/libdeflate-gzip\u000a\u000alibdeflate-gzip -12 of a kernel takes about a second, and its input\u000ausually did not change. Run it through cache-run.sh, as Build/lzma.\u000a\u000alibdeflate-gzip stores no mtime or file name, and -k -S .new gives the\u000asame output as -c.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "5b3be62345bde6ecabb1869a8a9a86abd1316c23",
        "msg" : "build: reuse the output of Build/libdeflate-gzip",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/image-commands.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/Makefile"
        ],
        "commitId" : "48c1e36bf2b8cbe1bfa07cc129cbc833d977d501",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "package: reuse the rootfs if its inputs did not change\u000a\u000aThe rootfs is installed from scratch on every build: apk add, then the\u000apost-install and init scripts of every package, one after the other.\u000aThis takes about 1.5 s, even if no package changed.\u000a\u000aBuild a key from the package index, which holds a hash of every\u000apackage, the install list, .config, SOURCE_DATE_EPOCH, the files\u000aoverlay, apk, tar, gzip and the Makefiles that create the rootfs. Save\u000aa copy of the rootfs with the key, and restore it from the copy if the\u000akey did not change. Later build steps modify the rootfs, so it is\u000aalways restored from the copy and never reused in place.\u000a\u000aprepare_rootfs runs tar and gzip over the apk script archive, so the\u000akey holds those two host tools as well. With mklibs it also runs\u000arstrip.sh, which the key then holds too.\u000a\u000aThe install list now holds the base-files, libc and kernel versions\u000atoo, so that the key can use it. Only the APK path uses the cache.\u000a\u000aThe copy costs disk: the build directory carries the root filesystem\u000atwice, once as root and root.orig and once in the cache.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "48c1e36bf2b8cbe1bfa07cc129cbc833d977d501",
        "msg" : "package: reuse the rootfs if its inputs did not change",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "rules.mk",
          "include/site/cache",
          "include/host-build.mk",
          "include/package.mk"
        ],
        "commitId" : "a0b036985afc5dd36a93faba1119b55b89780a3b",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: cache the autoconf results of a package that opts in\u000a\u000aA configure run spends its time on the compiler invocations behind its\u000achecks, not on the shell. tools/m4 runs the compiler 633 times and takes\u000a24 seconds. ccache does not help, because it refuses to cache an\u000aautoconf conftest compile at all; it counts these separately as\u000a\"Autoconf compile/link\" under its uncacheable calls.\u000a\u000aA package that sets PKG_CONFIGURE_CACHE or HOST_CONFIGURE_CACHE keeps a\u000aconfig.cache under tmp/, so a package that is cleaned and built again\u000areads the answers instead of running the checks. The configure stage of\u000atools/m4 drops from 24.5 s to 1.5 s. dirclean removes tmp/, so a full\u000areset of the tree starts from cold answers.\u000a\u000aA package has to opt in, because a cache is only correct for a configure\u000ascript that keeps its side effects outside the AC_CACHE_VAL body.\u000ancurses appends -D_XOPEN_SOURCE and -D_DEFAULT_SOURCE to CPPFLAGS inside\u000athat body, so a cached run restores the value, skips the append, and\u000athen fails to compile wcwidth. ncurses_cfg.h is identical in both cases;\u000athe difference is in the generated Makefile.\u000a\u000aThe path covers everything else that changes an answer. A target package\u000ais keyed on the toolchain directory, which carries the gcc version. A\u000ahost package is keyed on the version string of the host compiler,\u000abecause autoconf cannot detect a new compiler behind an unchanged name;\u000agcc 14 turned an implicit function declaration into an error and changed\u000amany answers that way. Both are keyed on a hash of the configure\u000aarguments and the build flags, and autoconf refuses a cache written with\u000adifferent flags on top of that.\u000a\u000aA cached program path outlives a wipe of staging_dir, so ac_cv_path_ and\u000aac_cv_prog_ answers are dropped when the cache loads and configure\u000asearches PATH again. Without that, a cache written before staging_dir\u000aheld sed pins /usr/bin/sed for good. A search runs no compiler, so this\u000acosts nothing that matters.\u000a\u000aThe cache arrives through a site script rather than --cache-file, so a\u000ahand written configure script never sees a new argument. The site script\u000aremoves the file of the previous arguments, so a different configuration\u000agets a cold cache instead of an autoconf error. It also unsets the\u000avariable, and make exports it for the configure stage alone, so a nested\u000aconfigure run keeps its own cache.\u000a\u000aSet CONFIGURE_CACHE_DIR to keep the cache elsewhere, or to the empty\u000astring to run every check again.\u000a\u000aHost builds now read a site script on Linux as well. Before this change\u000aonly Darwin had one.\u000a\u000aCONFIG_SITE holds one path name: autoconf before 2.70 reads the whole\u000avalue as that one name, so a second path would silence both scripts. It\u000anames the cache script alone, and the cache script loads the site script\u000aof the architecture from CONFIG_SITE_BASE.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "a0b036985afc5dd36a93faba1119b55b89780a3b",
        "msg" : "build: cache the autoconf results of a package that opts in",
        "paths" : [
          {
            "editType" : "add",
            "file" : "include/site/cache"
          },
          {
            "editType" : "edit",
            "file" : "include/host-build.mk"
          },
          {
            "editType" : "edit",
            "file" : "rules.mk"
          },
          {
            "editType" : "edit",
            "file" : "include/package.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tools/tar/Makefile",
          "tools/m4/Makefile",
          "tools/bison/Makefile",
          "tools/patch/Makefile",
          "tools/findutils/Makefile",
          "tools/cpio/Makefile",
          "tools/e2fsprogs/Makefile",
          "tools/elfutils/Makefile",
          "tools/gmp/Makefile",
          "tools/sed/Makefile"
        ],
        "commitId" : "cd322612ccb66e35878ed7f9d3e562f9f4b4bd09",
        "timestamp" : 1790093938000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "tools: cache the configure results of ten autotools tools\u000a\u000aThese ten hold up the wall clock on their own. Their configure stages\u000arun while nothing else does, because the tools build in dependency\u000aorder. Measured over a full build, cold cache against warm:\u000a\u000a  sed        21.68 s -> 1.22 s\u000a  m4         21.48 s -> 1.22 s\u000a  findutils  19.47 s -> 1.56 s\u000a  tar        17.75 s -> 1.47 s\u000a  cpio       14.28 s -> 1.26 s\u000a  bison      12.81 s -> 1.29 s\u000a  patch      12.16 s -> 1.31 s\u000a  elfutils   26.58 s -> 15.47 s\u000a\u000aEach of the ten configures the same way with a warm cache as it does\u000awithout one. The check runs configure three times, without a cache, with\u000aa cold cache and with a warm cache, and compares every file that\u000aconfigure generates between the first and the last. ncurses fails that\u000acheck; these do not.\u000a\u000aThe only difference left is ac_ct_AR and ac_ct_RANLIB, which a cold run\u000afills through the fallback path of AC_CHECK_TOOL and a warm run leaves\u000aempty. AR and RANLIB are correct in both, and no generated Makefile\u000areads the ac_ct_ form.\u000a\u000atools/cmake keeps its 33 s, the longest configure stage in the build. It\u000abootstraps with its own script rather than autoconf, so this does not\u000areach it.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:18:58 +0200",
        "id" : "cd322612ccb66e35878ed7f9d3e562f9f4b4bd09",
        "msg" : "tools: cache the configure results of ten autotools tools",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tools/elfutils/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/patch/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/cpio/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/bison/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/gmp/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/sed/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/findutils/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/e2fsprogs/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/m4/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/tar/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/system/apk/Makefile",
          "package/system/apk/patches/0012-crypto_openssl-use-deterministic-ECDSA-signatures.patch"
        ],
        "commitId" : "e923974fc1720954f04e3916072fda1fb14efc98",
        "timestamp" : 1790095590000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "apk: use deterministic ECDSA signatures\u000a\u000aThe host apk signs with LibreSSL, which uses a random ECDSA nonce. A\u000apackage that is signed again has different bytes and often a different\u000asize, even if its content did not change. The rootfs records the\u000apackage size in /lib/apk/db/installed, so a rebuild of one package\u000achanges all images.\u000a\u000aAdd a patch that derives the nonce as specified in RFC 6979. Signed\u000apackages and images are now identical after a rebuild.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:46:30 +0200",
        "id" : "e923974fc1720954f04e3916072fda1fb14efc98",
        "msg" : "apk: use deterministic ECDSA signatures",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/system/apk/Makefile"
          },
          {
            "editType" : "add",
            "file" : "package/system/apk/patches/0012-crypto_openssl-use-deterministic-ECDSA-signatures.patch"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/trusted-firmware-a.mk"
        ],
        "commitId" : "1e7c8fbc299665a3afe67773752cd14f35d7ec56",
        "timestamp" : 1790095590000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "trusted-firmware-a: use a reproducible build timestamp\u000a\u000aTF-A embeds __TIME__ and __DATE__ in its build message, so bl2 and bl31\u000adiffer on every build, and so do all images that contain them.\u000a\u000aPass BUILD_MESSAGE_TIMESTAMP, derived from the source date of the\u000apackage, in the same format.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:46:30 +0200",
        "id" : "1e7c8fbc299665a3afe67773752cd14f35d7ec56",
        "msg" : "trusted-firmware-a: use a reproducible build timestamp",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/trusted-firmware-a.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tools/yafut/patches/100-honour-SOURCE_DATE_EPOCH.patch",
          "tools/yafut/Makefile"
        ],
        "commitId" : "ec4768fbed8ea3b09e323cb267db0714a7d68eb7",
        "timestamp" : 1790095590000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "yafut: use a reproducible timestamp\u000a\u000ayaffsfs_CurrentTime() returns the wall clock, and Yaffs writes that value\u000ato the access, modification and change time of every object header. The\u000aRouterBOARD images of ipq40xx/mikrotik therefore differ on every build,\u000aand so does the sysupgrade metadata checksum that follows them.\u000a\u000aAdd a patch that reads SOURCE_DATE_EPOCH, which the build already exports.\u000a\u000aTested with two images written one second apart. They are identical with\u000aSOURCE_DATE_EPOCH set and differ without it.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:46:30 +0200",
        "id" : "ec4768fbed8ea3b09e323cb267db0714a7d68eb7",
        "msg" : "yafut: use a reproducible timestamp",
        "paths" : [
          {
            "editType" : "add",
            "file" : "tools/yafut/patches/100-honour-SOURCE_DATE_EPOCH.patch"
          },
          {
            "editType" : "edit",
            "file" : "tools/yafut/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/boot/uboot-mxs/Makefile",
          "package/boot/uboot-mxs/patches/0002-tools-mxsimage-honour-SOURCE_DATE_EPOCH.patch"
        ],
        "commitId" : "3a33c694aaa019d5a5619099d385b5bc12ebff3f",
        "timestamp" : 1790095590000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "uboot-mxs: use a reproducible build timestamp\u000a\u000amkimage -T mxsimage builds u-boot.sb. sb_get_timestamp() reads the wall\u000aclock and sb_prefill_image_header() writes it to the boot image header.\u000aThe header digest covers that field, so the sdcard images of mxs differ on\u000aevery build.\u000a\u000aAdd a patch that uses imagetool_get_source_date(), which the other image\u000atools already use, and keep the wall clock as the fallback.\u000a\u000aTested with the mxsimage configuration of u-boot. Two images are identical\u000awith the same SOURCE_DATE_EPOCH, differ with different values, and still\u000adiffer when the variable is not set.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:46:30 +0200",
        "id" : "3a33c694aaa019d5a5619099d385b5bc12ebff3f",
        "msg" : "uboot-mxs: use a reproducible build timestamp",
        "paths" : [
          {
            "editType" : "add",
            "file" : "package/boot/uboot-mxs/patches/0002-tools-mxsimage-honour-SOURCE_DATE_EPOCH.patch"
          },
          {
            "editType" : "edit",
            "file" : "package/boot/uboot-mxs/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/generic/pending-6.12/303-MIPS-vdso-keep-the-prefix-map-flags.patch",
          "target/linux/generic/pending-6.18/303-MIPS-vdso-keep-the-prefix-map-flags.patch"
        ],
        "commitId" : "0995a0e3511218deb4a492f28a9e181d3c2ca92b",
        "timestamp" : 1790095590000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "kernel: make the MIPS vDSO build id independent of the build path\u000a\u000aarch/mips/vdso/Makefile takes a few flags from KBUILD_CFLAGS and adds -g,\u000aso the vDSO always carries debug information. -ffile-prefix-map is not in\u000athat list, so DW_AT_comp_dir of the vDSO objects holds the absolute build\u000adirectory. The vDSO is linked with --build-id=sha1, which hashes the debug\u000ainformation, and objcopy -S then removes the debug information and keeps\u000athe note. The kernel embeds that image.\u000a\u000aEvery MIPS image therefore depends on the name of the build directory. The\u000areproducible build service works in a directory with a random name, so it\u000areports all MIPS targets as different. The ARM architectures add their vDSO\u000aflags on top of KBUILD_CFLAGS and are not affected.\u000a\u000aAdd a patch to 6.12 and to 6.18 that takes the two prefix map flags over\u000afrom KBUILD_CFLAGS.\u000a\u000aTested with two ath79/nand builds in directories of different name. Before\u000athe patch the vDSO build ids differ and all 91 images differ. After the\u000apatch the build ids match and all 91 images are identical.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:46:30 +0200",
        "id" : "0995a0e3511218deb4a492f28a9e181d3c2ca92b",
        "msg" : "kernel: make the MIPS vDSO build id independent of the build path",
        "paths" : [
          {
            "editType" : "add",
            "file" : "target/linux/generic/pending-6.18/303-MIPS-vdso-keep-the-prefix-map-flags.patch"
          },
          {
            "editType" : "add",
            "file" : "target/linux/generic/pending-6.12/303-MIPS-vdso-keep-the-prefix-map-flags.patch"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/generic/pending-6.18/304-LoongArch-vdso-keep-the-prefix-map-flags.patch",
          "target/linux/generic/pending-6.12/304-LoongArch-vdso-keep-the-prefix-map-flags.patch"
        ],
        "commitId" : "115209aa225a9b2d8b849809eaa4969de8e8c539",
        "timestamp" : 1790095590000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "kernel: make the LoongArch vDSO build id independent of the build path\u000a\u000aThe LoongArch vDSO Makefile builds its objects with a flag set of its own,\u000ain the same way as the MIPS one. It drops -ffile-prefix-map, adds -g and\u000alinks with --build-id, so the build id of the vDSO follows the absolute\u000apath of the build directory. The kernel embeds the vDSO, so two builds in\u000adifferent directories produce different images.\u000a\u000aTake the prefix map flags over from KBUILD_CFLAGS.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:46:30 +0200",
        "id" : "115209aa225a9b2d8b849809eaa4969de8e8c539",
        "msg" : "kernel: make the LoongArch vDSO build id independent of the build path",
        "paths" : [
          {
            "editType" : "add",
            "file" : "target/linux/generic/pending-6.18/304-LoongArch-vdso-keep-the-prefix-map-flags.patch"
          },
          {
            "editType" : "add",
            "file" : "target/linux/generic/pending-6.12/304-LoongArch-vdso-keep-the-prefix-map-flags.patch"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/ixp4xx/image/Makefile",
          "target/linux/ramips/image/mt76x8.mk",
          "target/linux/ipq40xx/image/generic.mk",
          "scripts/linksys-image.sh",
          "target/linux/qualcommax/image/ipq60xx.mk",
          "target/linux/bcm53xx/image/Makefile",
          "target/linux/qualcommax/image/ipq807x.mk"
        ],
        "commitId" : "8e7a8a2b9210481adbfbfe42aa37cfc804817674",
        "timestamp" : 1790095590000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "image: create the archive images with fixed metadata\u000a\u000aSeveral image recipes call tar without the options that pin the member\u000aorder, the owner, the mode and the modification time. The archive then\u000aholds the build time, the umask of the build user and the readdir order of\u000athe build directory, so two builds of the same source produce different\u000aimages.\u000a\u000aPass the same options that Image/mkfs/targz and sysupgrade-tar.sh already\u000ause. The recipes define no member order, so sorting the members takes\u000anothing away. The diffoscope of the published WAX610 archive shows the\u000aorder differing between the build machines, which is what a readdir order\u000aproduces.\u000a\u000a--mode=go-w clears the write bit of the group and of the others. tar keeps\u000athe mode of the file on disk, which follows the umask of the build user,\u000aso without it the archive differs between a host with umask 022 and one\u000awith umask 002.\u000a\u000aCovers the Netgear factory archives of ipq40xx, ipq60xx and ipq807x, the\u000aCreality factory archive of mt76x8, the D-Link DWL8610AP archive of\u000abcm53xx, the Freecom archive of ixp4xx and the Linksys switch archive of\u000arealtek.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:46:30 +0200",
        "id" : "8e7a8a2b9210481adbfbfe42aa37cfc804817674",
        "msg" : "image: create the archive images with fixed metadata",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/qualcommax/image/ipq807x.mk"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/ipq40xx/image/generic.mk"
          },
          {
            "editType" : "edit",
            "file" : "scripts/linksys-image.sh"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/qualcommax/image/ipq60xx.mk"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/ixp4xx/image/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/bcm53xx/image/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/ramips/image/mt76x8.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/image/Makefile"
        ],
        "commitId" : "92f41f89436d33e1dbb7ac6e9aa8c5f0326e4e37",
        "timestamp" : 1790095590000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "realtek: use a reproducible timestamp in the 7z kernel container\u000a\u000a7zr stores the modification time of the input file. The kernel image\u000acarries the build time, so the H3C and HPE images differ between builds.\u000a\u000aSet the time of the input to SOURCE_DATE_EPOCH before the archive is\u000acreated.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:46:30 +0200",
        "id" : "92f41f89436d33e1dbb7ac6e9aa8c5f0326e4e37",
        "msg" : "realtek: use a reproducible timestamp in the 7z kernel container",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/image/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/boot/uboot-mediatek/Makefile",
          "package/boot/uboot-mediatek/patches/009-tools-mtk_image-honour-SOURCE_DATE_EPOCH.patch"
        ],
        "commitId" : "03ffe29cdf03b3824a621a63c098ac7e477282a0",
        "timestamp" : 1790095590000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "uboot-mediatek: use a reproducible build timestamp for MT7621\u000a\u000amtk_image_set_mt7621_header() reads the wall clock and writes it to the\u000atimestamp of the legacy image header, so the MT7621 boot loader image\u000adiffers on every build.\u000a\u000aAdd a patch that uses imagetool_get_source_date(), which the other image\u000atools already use, and keep the wall clock as the fallback.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:46:30 +0200",
        "id" : "03ffe29cdf03b3824a621a63c098ac7e477282a0",
        "msg" : "uboot-mediatek: use a reproducible build timestamp for MT7621",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/boot/uboot-mediatek/Makefile"
          },
          {
            "editType" : "add",
            "file" : "package/boot/uboot-mediatek/patches/009-tools-mtk_image-honour-SOURCE_DATE_EPOCH.patch"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/bmips/image/Makefile"
        ],
        "commitId" : "f73a0d39e172402e42bce02e62592280fc96f806",
        "timestamp" : 1790095590000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "bmips: squash the owner and the mode in the CFE JFFS2 partition\u000a\u000aBuild/cfe-jffs2 is the only mkfs.jffs2 call in the tree that passes\u000aneither --squash-uids nor --squash-perms. The recipe creates the marker\u000afiles with touch and cp, so the JFFS2 inodes carry the uid, the gid and\u000athe umask of the build machine. The published images hold uid and gid\u000a1000.\u000a\u000amkfs.jffs2 already takes the timestamp from SOURCE_DATE_EPOCH, so the\u000aowner and the mode are the remaining inputs from the environment.\u000a\u000aPass both options, as mvebu and ath79 already do.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:46:30 +0200",
        "id" : "f73a0d39e172402e42bce02e62592280fc96f806",
        "msg" : "bmips: squash the owner and the mode in the CFE JFFS2 partition",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/bmips/image/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/imx/image/cortexa9.mk"
        ],
        "commitId" : "fc166c4869dba4876ad3d7d6e12a8ff87c35ca2a",
        "timestamp" : 1790095590000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "imx: fix the boot file system of the Gateworks Ventana\u000a\u000aBuild/boot-overlay copies the device trees and builds the boot script in\u000a$@.boot, so every file carries the build time. mkfs.ubifs writes st_mtime\u000astraight into the inode and has no SOURCE_DATE_EPOCH support, and the two\u000atar calls pass neither --sort=name nor the options that pin the owner and\u000athe mode, so both nand.ubi and bootfs.tar.gz differ between builds.\u000a\u000aThe diffoscope of the published bootfs.tar.gz shows both: wall clock\u000amtimes on the device tree files, and a member order that follows readdir.\u000a\u000aSet the times in $@.boot once, before the UBIFS image and the tar are\u000amade. Sort the members of both archives and give them a fixed owner and\u000amode, as the other archive recipes do.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:46:30 +0200",
        "id" : "fc166c4869dba4876ad3d7d6e12a8ff87c35ca2a",
        "msg" : "imx: fix the boot file system of the Gateworks Ventana",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/imx/image/cortexa9.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/kernel/lantiq/ltq-tapi/patches/021-keep-build-paths-out-of-the-configure-string.patch",
          "package/kernel/lantiq/ltq-tapi/Makefile",
          "package/kernel/lantiq/ltq-vmmc/patches/022-keep-build-paths-out-of-the-configure-string.patch",
          "package/kernel/lantiq/ltq-vmmc/Makefile"
        ],
        "commitId" : "661d6963dfed41b291be3bcb98523d44ce7a872c",
        "timestamp" : 1790095590000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "lantiq: keep build paths out of the TAPI and VMMC modules\u000a\u000aconfigure.in of drv_tapi and drv_vmmc compiles the whole configure command\u000aline into the module. drv_tapi_linux.c prints it through a proc file. The\u000acommand line holds the absolute paths of the build machine, among them\u000a--enable-kernelbuild, --with-ifxos-incl, --enable-tapiincl, CPPFLAGS and\u000aLDFLAGS, so the module depends on the directory it was built in.\u000a\u000aMeasured in the published snapshot modules of lantiq/xway: drv_tapi.ko and\u000adrv_vmmc.ko both hold\u000a--enable-kernelbuild=/builder/shared-workdir/build/build_dir/...\u000aThe existing 020-not-leak-cflags.patch covers the Kbuild CFLAGS, not this\u000astring.\u000a\u000aDrop every argument that holds a path and keep the feature flags. The loop\u000arepeats the idiom the file already uses for CONFIGURE_OPTIONS.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:46:30 +0200",
        "id" : "661d6963dfed41b291be3bcb98523d44ce7a872c",
        "msg" : "lantiq: keep build paths out of the TAPI and VMMC modules",
        "paths" : [
          {
            "editType" : "add",
            "file" : "package/kernel/lantiq/ltq-tapi/patches/021-keep-build-paths-out-of-the-configure-string.patch"
          },
          {
            "editType" : "edit",
            "file" : "package/kernel/lantiq/ltq-vmmc/Makefile"
          },
          {
            "editType" : "add",
            "file" : "package/kernel/lantiq/ltq-vmmc/patches/022-keep-build-paths-out-of-the-configure-string.patch"
          },
          {
            "editType" : "edit",
            "file" : "package/kernel/lantiq/ltq-tapi/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "scripts/make-sbom.py",
          "scripts/package-metadata.pl"
        ],
        "commitId" : "712ff7ca89f76f6fdcb3289f78b7176174013a1e",
        "timestamp" : 1790095590000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: create reproducible CycloneDX SBOMs\u000a\u000aBoth SBOM generators produce a different file on every run, so the\u000apublished .bom.cdx.json of an image and of a package feed never match a\u000arebuild.\u000a\u000adump_cyclonedxsbom_json() in scripts/package-metadata.pl has three\u000acauses. It draws the serial number from rand(), it takes the timestamp\u000afrom the wall clock, and encode_json() follows the Perl hash order, which\u000achanges with the hash seed of each run. The last one alone reorders every\u000akey in the file.\u000a\u000ascripts/make-sbom.py has the first two causes, through uuid.uuid4() and\u000adatetime.utcnow().\u000a\u000aTake the timestamp from SOURCE_DATE_EPOCH, which the build exports. Derive\u000athe serial number from the timestamp and the component list, so it stays a\u000avalid RFC 4122 identifier and still changes when the content changes. Sort\u000athe keys of the Perl output.\u000a\u000aTested with the package index and the image manifest of an ipq40xx build.\u000aTwo runs with the same SOURCE_DATE_EPOCH are now identical, two runs with\u000adifferent values differ, and the scripts exit with an error when the value\u000ais not a number. Both files differ between two runs without the change.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:46:30 +0200",
        "id" : "712ff7ca89f76f6fdcb3289f78b7176174013a1e",
        "msg" : "build: create reproducible CycloneDX SBOMs",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "scripts/package-metadata.pl"
          },
          {
            "editType" : "edit",
            "file" : "scripts/make-sbom.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/kernel.mk",
          "include/package.mk",
          "rules.mk"
        ],
        "commitId" : "b06e5f3bf9246d5d299142f5a774497f07b8ec2d",
        "timestamp" : 1790095590000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: map the staging directory out of the compiler output\u000a\u000airemap is called with BUILD_DIR and with PKG_BUILD_DIR, never with\u000aSTAGING_DIR. A header taken from the staging directory therefore reaches\u000a__FILE__ and the debug information with its absolute path, and the result\u000adepends on the directory the tree was built in.\u000a\u000aMeasured in the published snapshot of lantiq/xway: mt76-connac-lib.ko,\u000amt76x02-lib.ko and mt7925-common.ko hold\u000a/builder/shared-workdir/build/staging_dir/target-mips_24kc_musl/usr/include/mac80211/net/cfg80211.h\u000aThat path is __FILE__ in .rodata, so the strip before the package is built\u000acannot reach it and the module ships it.\u000a\u000aMap STAGING_DIR as well. Keep the staging_dir element in the replacement:\u000athe last element of STAGING_DIR and of BUILD_DIR carry the same name, so\u000athe bare name would make the two roots indistinguishable. The map of\u000aBUILD_DIR does not change, so only a path that leaks today changes.\u000a\u000aVerified with the target compiler on a header below a mapped directory:\u000a-ffile-prefix-map removes the absolute path from both __FILE__ and the\u000adebug information, -fmacro-prefix-map removes it from __FILE__ alone. The\u000ashipped half is __FILE__, so both variants cover it.\u000a\u000aA local build of mt76 also holds nine staging paths, but those are debug\u000ainformation: the build directory copy of mt76-connac-lib.ko is 653456\u000abytes with 13 debug sections and nine such paths, the shipped copy is\u000a84688 bytes with none. They are named here so that the next reader does\u000anot take them for the same defect.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:46:30 +0200",
        "id" : "b06e5f3bf9246d5d299142f5a774497f07b8ec2d",
        "msg" : "build: map the staging directory out of the compiler output",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/kernel.mk"
          },
          {
            "editType" : "edit",
            "file" : "include/package.mk"
          },
          {
            "editType" : "edit",
            "file" : "rules.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "toolchain/gcc/common.mk"
        ],
        "commitId" : "fa081cadb824d6b104386471eaecb217b665a9a9",
        "timestamp" : 1790095590000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "toolchain: keep the build path out of the target libraries\u000a\u000agcc builds the target libraries with CFLAGS_FOR_TARGET, which carries no\u000aprefix map. __FILE__ therefore expands to an absolute path, and assert in\u000alibstdc++ and the ryu code put seven of them into .rodata, where the strip\u000abefore packaging cannot reach them. The libstdcpp6 package differs between\u000atwo builds in different directories, and so does every image that ships it.\u000a\u000aThe published package shows the same thing. libstdcpp6-14.4.0-r5.apk of\u000abcm47xx/mips74k holds\u000a/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\u000aso no rebuild of that package can match today.\u000a\u000airemap is called with BUILD_DIR for the kernel, with PKG_BUILD_DIR for a\u000apackage and with STAGING_DIR for the target headers. The toolchain build\u000adirectory has no such call. Add one for the three FOR_TARGET flag sets.\u000a\u000aThe replacement keeps the build_dir element, because the last element of\u000athe toolchain build directory and of the toolchain staging directory is\u000athe same string and one replacement for both would make the two roots\u000aindistinguishable.\u000a\u000aTested with two bcm47xx/mips74k trees whose directory names differ in\u000alength. The shipped libstdc++.so.6.0.33 holds no absolute path any more\u000aand the libstdcpp6 package is now identical in both trees. It differed by\u000a165 bytes before.\u000a\u000aThe toolchain staging directory still appears in the debug information of\u000athe same library, 244 times. Those are DWARF include directories, they do\u000anot survive the strip, and no shipped file carries them.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:46:30 +0200",
        "id" : "fa081cadb824d6b104386471eaecb217b665a9a9",
        "msg" : "toolchain: keep the build path out of the target libraries",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "toolchain/gcc/common.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/boot/uboot-lantiq/Makefile",
          "package/boot/uboot-lantiq/patches/201-Makefile-honour-SOURCE_DATE_EPOCH.patch"
        ],
        "commitId" : "b1aa81b442ba95273304ff9d060775b3617c37cf",
        "timestamp" : 1790095590000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "uboot-lantiq: use a reproducible build timestamp\u000a\u000au-boot 2013.10 builds timestamp_autogenerated.h with a bare date call, so\u000aU_BOOT_DATE and U_BOOT_TIME hold the wall clock and the banner of every\u000aimage changes on each build:\u000a\u000a  U-Boot 2013.10-openwrt4 (Sep 21 2026 - 20:47:50) ARV7506PW11\u000a\u000aAdd a patch that uses SOURCE_DATE_EPOCH when the environment provides it,\u000awhich the build already exports, and keeps the wall clock otherwise. Later\u000au-boot versions do the same in their own timestamp rule, which is why only\u000athis package needs the change.\u000a\u000aFound with two lantiq/xway trees whose directory names differ in length.\u000aThree bytes of u-boot.bin differed, all inside the banner. After the\u000achange the three u-boot images of arv7506pw11 are identical in both trees\u000aand the banner follows the source date.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:46:30 +0200",
        "id" : "b1aa81b442ba95273304ff9d060775b3617c37cf",
        "msg" : "uboot-lantiq: use a reproducible build timestamp",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/boot/uboot-lantiq/Makefile"
          },
          {
            "editType" : "add",
            "file" : "package/boot/uboot-lantiq/patches/201-Makefile-honour-SOURCE_DATE_EPOCH.patch"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/kernel-defaults.mk",
          "include/rootfs.mk"
        ],
        "commitId" : "3a16a57c08e9b6dcfcccf9a5eb611c79eadff2c9",
        "timestamp" : 1790095590000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "kernel: keep /init out of the root filesystem images\u000a\u000aThe initramfs step copied /init into the root filesystem directory and\u000anever removed it again. With CONFIG_TARGET_PER_DEVICE_ROOTFS the\u000ainitramfs kernel and the rootfs image of a device come from that same\u000adirectory. Nothing orders the two steps, so /init entered the squashfs\u000aimage or not, depending on which step ran first. The reproducible build\u000aservice reports this as a difference between the published image and a\u000arebuild.\u000a\u000aAdd /init to the initramfs from outside the root filesystem instead. A\u000abuilt in initramfs gets it through a gen_init_cpio list file. A separate\u000acpio gets it appended to the finished archive. The mode is now fixed at\u000a0755 and no longer follows the umask of the checkout.\u000a\u000aThe initramfs step also normalised the mtime of the root filesystem\u000adirectory. Do that in prepare_rootfs, so no step writes to the directory\u000aafter the image build can start.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 18:46:30 +0200",
        "id" : "3a16a57c08e9b6dcfcccf9a5eb611c79eadff2c9",
        "msg" : "kernel: keep /init out of the root filesystem images",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/kernel-defaults.mk"
          },
          {
            "editType" : "edit",
            "file" : "include/rootfs.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/boot/arm-trusted-firmware-microchipsw/Makefile"
        ],
        "commitId" : "d15fd263f7214f9b71121039f871cb94ae4f9ced",
        "timestamp" : 1790098675000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robimarko",
          "fullName" : "robimarko"
        },
        "authorEmail" : "robimarko@gmail.com",
        "comment" : "boot: arm-trusted-firmware-microchipsw: update to v2.8.17-mchp4\u000a\u000aMicrochip has fixed various issues since the last update, so update TF-A.\u000a\u000aSigned-off-by: Robert Marko <robert.marko@sartura.hr>\u000a",
        "date" : "2026-09-22 19:37:55 +0200",
        "id" : "d15fd263f7214f9b71121039f871cb94ae4f9ced",
        "msg" : "boot: arm-trusted-firmware-microchipsw: update to v2.8.17-mchp4",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/boot/arm-trusted-firmware-microchipsw/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/boot/arm-trusted-firmware-microchipsw/patches/0004-plat-microchip-convert-FWU-scripts-to-Python.patch",
          "package/boot/arm-trusted-firmware-microchipsw/Makefile",
          "package/boot/arm-trusted-firmware-microchipsw/patches/0004-microchip-lan969x-do-not-rely-on-Ruby-shebang.patch"
        ],
        "commitId" : "b24e4338646f62c6dd8d138d41ced466362911cf",
        "timestamp" : 1790098675000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robimarko",
          "fullName" : "robimarko"
        },
        "authorEmail" : "robimarko@gmail.com",
        "comment" : "boot: arm-trusted-firmware-microchipsw: convert FWU scripts to Python\u000a\u000aCurrently, we depend on building the host Ruby support just for the two\u000aFWU scripts that are written in Ruby.\u000a\u000aUse Codex 5.6 to convert the scripts to Python and drop Ruby dependency.\u000a\u000aSigned-off-by: Robert Marko <robert.marko@sartura.hr>\u000a",
        "date" : "2026-09-22 19:37:55 +0200",
        "id" : "b24e4338646f62c6dd8d138d41ced466362911cf",
        "msg" : "boot: arm-trusted-firmware-microchipsw: convert FWU scripts to Python",
        "paths" : [
          {
            "editType" : "add",
            "file" : "package/boot/arm-trusted-firmware-microchipsw/patches/0004-plat-microchip-convert-FWU-scripts-to-Python.patch"
          },
          {
            "editType" : "edit",
            "file" : "package/boot/arm-trusted-firmware-microchipsw/Makefile"
          },
          {
            "editType" : "delete",
            "file" : "package/boot/arm-trusted-firmware-microchipsw/patches/0004-microchip-lan969x-do-not-rely-on-Ruby-shebang.patch"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/system/procd/Makefile",
          "package/system/procd/files/uxc.sh"
        ],
        "commitId" : "56d9cd66a8ec84989618f3fea76e429c2d2eeda5",
        "timestamp" : 1790100067000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/daniel",
          "fullName" : "daniel"
        },
        "authorEmail" : "daniel@makrotopia.org",
        "comment" : "procd: update to git HEAD of 2026-09-22\u000a\u000aVarious bug fixes and container runtime improvements.\u000a\u000aFixes: #25277 (at least)\u000aSigned-off-by: Daniel Golle <daniel@makrotopia.org>\u000a",
        "date" : "2026-09-22 19:01:07 +0100",
        "id" : "56d9cd66a8ec84989618f3fea76e429c2d2eeda5",
        "msg" : "procd: update to git HEAD of 2026-09-22",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/system/procd/files/uxc.sh"
          },
          {
            "editType" : "edit",
            "file" : "package/system/procd/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tools/lzma/Makefile",
          "tools/mkimage/Makefile",
          "tools/mtools/Makefile"
        ],
        "commitId" : "0f05c481fd445d49fdea6962952a84d53d03da1c",
        "timestamp" : 1790101799000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "tools: pass the job server to the compile step of mtools, mkimage and lzma\u000a\u000ahost-build.mk clears MAKEFLAGS, so a custom Host/Compile that runs a bare\u000a$(MAKE) builds with one job, whatever HOST_BUILD_PARALLEL says. mtools\u000asets the flag, but its compile step never used it.\u000a\u000aEach of the three now passes $(HOST_JOBS), and mkimage and lzma set\u000aHOST_BUILD_PARALLEL:\u000a\u000a  mkimage  11.7 s -> 7.2 s\u000a  mtools    8.3 s -> 4.8 s\u000a  lzma      4.0 s -> 1.8 s\u000a\u000aEach one builds five times out of five with the job server, and each\u000abuild installs files that are identical to those of a serial build.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 20:29:59 +0200",
        "id" : "0f05c481fd445d49fdea6962952a84d53d03da1c",
        "msg" : "tools: pass the job server to the compile step of mtools, mkimage and lzma",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tools/mtools/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/mkimage/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/lzma/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tools/make-ext4fs/Makefile",
          "tools/automake/Makefile",
          "tools/dosfstools/Makefile",
          "tools/libtool/Makefile",
          "tools/autoconf/Makefile"
        ],
        "commitId" : "c3447b76fe2c76e1eedf4fca0a8955a8cb568677",
        "timestamp" : 1790101799000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "tools: build autoconf, automake, libtool, dosfstools and make-ext4fs in parallel\u000a\u000a  libtool      22.5 s -> 20.0 s\u000a  dosfstools    6.0 s ->  4.8 s\u000a  make-ext4fs   2.1 s ->  1.2 s\u000a  automake      3.9 s ->  3.4 s\u000a  autoconf      3.1 s ->  2.6 s\u000a\u000aEach one builds five times out of five with the job server, and each\u000abuild installs files that are identical to those of a serial build.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 20:29:59 +0200",
        "id" : "c3447b76fe2c76e1eedf4fca0a8955a8cb568677",
        "msg" : "tools: build autoconf, automake, libtool, dosfstools and make-ext4fs in parallel",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tools/automake/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/dosfstools/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/libtool/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/autoconf/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/make-ext4fs/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tools/sparse/Makefile"
        ],
        "commitId" : "37f7186e75b0af0a1338fd6625f3f3881c2fce01",
        "timestamp" : 1790101799000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "tools/sparse: build in parallel\u000a\u000asparse set PKG_BUILD_PARALLEL, which a host build does not read, so it\u000abuilt with one job. Use HOST_BUILD_PARALLEL: 6.6 s -> 1.3 s.\u000a\u000aIt builds five times out of five with the job server, and each build\u000ainstalls files that are identical to those of a serial build.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 20:29:59 +0200",
        "id" : "37f7186e75b0af0a1338fd6625f3f3881c2fce01",
        "msg" : "tools/sparse: build in parallel",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tools/sparse/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/site/cache",
          "rules.mk"
        ],
        "commitId" : "18a2ea702cf3111a21deed641f946d31f4e09018",
        "timestamp" : 1790101799000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "build: start the configure cache cold when its answers may be stale\u000a\u000aThree cases kept a cached answer that no longer held:\u000a\u000aA new configure script. A package with an autoreconf fixup regenerates\u000aconfigure with the staged autoconf, automake and libtool, and a new\u000aversion of one of them can change what a cache variable means. The site\u000ascript now keeps a checksum of configure beside the cache and drops the\u000acache when the checksum changes. A new patch to configure is covered too.\u000a\u000aA changed precious variable. configure aborts when LIBS, CPP or another\u000aprecious variable differs from the value in the cache, and because\u000anothing removes the cache, it aborts on every later run as well:\u000a\u000a  configure: error: 'LIBS' was not set in the previous run\u000a  configure: error: changes in the environment can compromise the build\u000a\u000aThe site script now makes the same comparison before configure does and\u000adrops the cache on a difference.\u000a\u000aPaths under other names. The libtool answers lt_cv_path_*, acl_cv_path_*\u000aand lt_cv_sys_global_symbol_*, and gmp_cv_prog_m4, hold the path of a\u000asystem tool or of the staged sed and m4, and survived a wipe of\u000astaging_dir. The site script now drops them with the ac_cv_path_ answers.\u000a\u000am4 and gmp still configure the same way with a warm cache as they do\u000awithout one, and still read it: the m4 configure stage takes 1.5 s warm\u000aagainst 23 s cold.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 20:29:59 +0200",
        "id" : "18a2ea702cf3111a21deed641f946d31f4e09018",
        "msg" : "build: start the configure cache cold when its answers may be stale",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "rules.mk"
          },
          {
            "editType" : "edit",
            "file" : "include/site/cache"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tools/bc/Makefile",
          "tools/expat/Makefile",
          "tools/mtools/Makefile",
          "tools/flex/Makefile",
          "tools/xz/Makefile",
          "tools/libressl/Makefile",
          "tools/libtool/Makefile",
          "tools/fakeroot/Makefile",
          "tools/gengetopt/Makefile",
          "tools/mtd-utils/Makefile",
          "tools/dosfstools/Makefile"
        ],
        "commitId" : "6eae1d6b772eeb012046f64be83ecf9ea5ef7514",
        "timestamp" : 1790101799000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/john",
          "fullName" : "john"
        },
        "authorEmail" : "john@phrozen.org",
        "comment" : "tools: cache the configure results of eleven more autotools tools\u000a\u000aConfigure stage without a cache against a warm cache:\u000a\u000a  mtools      3.34 s -> 0.28 s\u000a  gengetopt   4.39 s -> 2.13 s\u000a  fakeroot   10.97 s -> 8.73 s\u000a  xz          4.32 s -> 2.17 s\u000a  libressl    3.07 s -> 1.46 s\u000a  flex       12.32 s -> 10.98 s\u000a  expat       2.74 s -> 1.52 s\u000a  bc          1.34 s -> 0.38 s\u000a  dosfstools  3.13 s -> 2.54 s\u000a  libtool     2.86 s -> 2.29 s\u000a  mtd-utils   4.06 s -> 3.56 s\u000a\u000aflex, fakeroot, dosfstools and mtd-utils run autoreconf in the same\u000astage, and the cache does not reach that part.\u000a\u000aEach of the eleven configures the same way with a warm cache as it does\u000awithout one: the check configures three times, without a cache, with a\u000acold cache and with a warm cache, and every generated file of the first\u000aand the last run is identical. A static scan of each configure script\u000afound no cache check that changes CFLAGS, CPPFLAGS, LDFLAGS or LIBS\u000awithout restoring it.\u000a\u000apatchelf, mklibs and automake pass the same check but gain less than\u000ahalf a second, so they stay out.\u000a\u000amake world after make tools/clean now takes 121 s against 177 s with\u000acold caches.\u000a\u000aSigned-off-by: John Crispin <john@phrozen.org>\u000a",
        "date" : "2026-09-22 20:29:59 +0200",
        "id" : "6eae1d6b772eeb012046f64be83ecf9ea5ef7514",
        "msg" : "tools: cache the configure results of eleven more autotools tools",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tools/flex/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/expat/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/xz/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/fakeroot/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/mtd-utils/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/gengetopt/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/libressl/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/dosfstools/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/libtool/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/bc/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "tools/mtools/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/generic/pending-6.18/304-LoongArch-vdso-keep-the-prefix-map-flags.patch",
          "target/linux/generic/pending-6.12/304-LoongArch-vdso-keep-the-prefix-map-flags.patch"
        ],
        "commitId" : "67fcd3e5698a2dbf3d71068fce2dcfacc3a3109d",
        "timestamp" : 1790106068000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/jonas",
          "fullName" : "jonas"
        },
        "authorEmail" : "jonas@jonasjelonek.de",
        "comment" : "generic: refresh the LoongArch vDSO prefix map patch\u000a\u000aThe patch ends in an empty line where quilt writes a context line\u000aholding a single space, so `make target/linux/refresh` rewrites it\u000aand the kernel patch check fails on every target.\u000a\u000aFixes: 115209aa225a (\"kernel: make the LoongArch vDSO build id independent of the build path\")\u000aAssisted-by: Claude:claude-opus-5-5\u000aSigned-off-by: Julius Bairaktaris <julius@bairaktaris.de>\u000aLink: https://github.com/openwrt/openwrt/pull/25333\u000aSigned-off-by: Jonas Jelonek <jonas@jonasjelonek.de>\u000a",
        "date" : "2026-09-22 21:41:08 +0200",
        "id" : "67fcd3e5698a2dbf3d71068fce2dcfacc3a3109d",
        "msg" : "generic: refresh the LoongArch vDSO prefix map patch",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/generic/pending-6.18/304-LoongArch-vdso-keep-the-prefix-map-flags.patch"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/generic/pending-6.12/304-LoongArch-vdso-keep-the-prefix-map-flags.patch"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/ath79/image/generic.mk",
          "target/linux/ath79/generic/config-default"
        ],
        "commitId" : "2e5345462eeb203b54d2805b388cae271041b8a5",
        "timestamp" : 1790109688000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/jonas",
          "fullName" : "jonas"
        },
        "authorEmail" : "jonas@jonasjelonek.de",
        "comment" : "ath79: use module for Fritz 300E\u000a\u000aThe generic config builds CONFIG_INTEL_XWAY_PHY for all devices while\u000aonly a single one uses it. Avoid bloating the kernel by using the module\u000afor the only device that uses this PHY.\u000a\u000aSigned-off-by: Rosen Penev <rosenp@gmail.com>\u000aLink: https://github.com/openwrt/openwrt/pull/25294\u000aSigned-off-by: Jonas Jelonek <jonas@jonasjelonek.de>\u000a",
        "date" : "2026-09-22 22:41:28 +0200",
        "id" : "2e5345462eeb203b54d2805b388cae271041b8a5",
        "msg" : "ath79: use module for Fritz 300E",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/ath79/generic/config-default"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/ath79/image/generic.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/ath79/dts/qca9558_tplink_archer-c.dtsi",
          "target/linux/ath79/generic/base-files/etc/board.d/02_network",
          "target/linux/ath79/generic/base-files/etc/board.d/05_compat-version",
          "target/linux/ath79/image/generic-tp-link.mk"
        ],
        "commitId" : "7d1c5a68e534652378cd14e2ef8f9732567a2a69",
        "timestamp" : 1790109798000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/jonas",
          "fullName" : "jonas"
        },
        "authorEmail" : "jonas@jonasjelonek.de",
        "comment" : "ath79: convert qca9558_tplink_archer-c.dtsi to swconfig\u000a\u000aThis reverts commit 487ff3cfa03771102c18a987acd83f8ea020e5e3.\u000a\u000aThree problems:\u000a\u000aCONFIG_AR8216_PHY is enabled and to stop it from interfering and\u000acrashing on boot, internal MDIO needs to be used.\u000a\u000aOnce internal MDIO gets used, ports end up dying even in the absence of\u000atraffic. This is currently believed to be an issue with qca,qca8327\u000aspecifically. There are no reports of qca,qca8337 behaving badly.\u000a\u000aRouting speed with DSA becomes much slower. Gigabit routing is no longer\u000adoable, even with flow offload. This needs further research.\u000a\u000aSigned-off-by: Rosen Penev <rosenp@gmail.com>\u000aLink: https://github.com/openwrt/openwrt/pull/25308\u000aSigned-off-by: Jonas Jelonek <jonas@jonasjelonek.de>\u000a",
        "date" : "2026-09-22 22:43:18 +0200",
        "id" : "7d1c5a68e534652378cd14e2ef8f9732567a2a69",
        "msg" : "ath79: convert qca9558_tplink_archer-c.dtsi to swconfig",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/ath79/generic/base-files/etc/board.d/02_network"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/ath79/dts/qca9558_tplink_archer-c.dtsi"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/ath79/generic/base-files/etc/board.d/05_compat-version"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/ath79/image/generic-tp-link.mk"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/network/utils/comgt/Makefile",
          "package/network/utils/comgt/files/ncm.json"
        ],
        "commitId" : "19ff245b9233060bcbf55ec50cc3086d4348b72c",
        "timestamp" : 1790111268000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/jonas",
          "fullName" : "jonas"
        },
        "authorEmail" : "jonas@jonasjelonek.de",
        "comment" : "comgt: add ncm support for Fibocom FG621-EA modem\u000a\u000aAdd a vendor profile for Fibocom modems so that proto ncm can drive them.\u000aWithout it ncm.sh reports UNSUPPORTED_MODEM, as the manufacturer string\u000areturned by AT+CGMI has no matching key in ncm.json.\u000a\u000aThe FG621-EA is used in the ASUS 4G-AX56 and the TP-Link TL-MR500 v1. The\u000aprofile keys off the manufacturer string rather than any particular board,\u000aso it applies to Fibocom NCM modems generally.\u000a\u000ancm.json is installed by comgt-ncm, so bump PKG_RELEASE to make sure\u000aexisting installations pick up the new vendor profile on upgrade.\u000a\u000aThis change originates from PR #19793 by kddred, open in draft since\u000aAugust 2025 without review. The original commit is authored and signed\u000aoff with a GitHub noreply address, which the commit formality check\u000arejects, so it could not be carried unmodified, and kddred has not been\u000aactive since August 2025. Authorship is reassigned for that reason alone;\u000athe work is theirs. Happy to restore the original authorship if a usable\u000aaddress becomes available.\u000a\u000aTested on an ASUS 4G-AX56 (HW rev A1) on both main and openwrt-25.12.\u000a\u000aLink: https://github.com/openwrt/openwrt/pull/19793\u000aSigned-off-by: Fredrik Hallin <fredappsdev@outlook.com>\u000aLink: https://github.com/openwrt/openwrt/pull/24974\u000aSigned-off-by: Jonas Jelonek <jonas@jonasjelonek.de>\u000a",
        "date" : "2026-09-22 23:07:48 +0200",
        "id" : "19ff245b9233060bcbf55ec50cc3086d4348b72c",
        "msg" : "comgt: add ncm support for Fibocom FG621-EA modem",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/network/utils/comgt/files/ncm.json"
          },
          {
            "editType" : "edit",
            "file" : "package/network/utils/comgt/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/patches-6.18/040-v7.4-spi-realtek-rtl-add-support-for-second-CS.patch"
        ],
        "commitId" : "c09e3f28ba110394a1aa4b765d73a4b53e7c90b6",
        "timestamp" : 1790149366000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/jonas",
          "fullName" : "jonas"
        },
        "authorEmail" : "jonas@jonasjelonek.de",
        "comment" : "realtek: spi: backport patch to support second SPI CS\u000a\u000aBackports an accepted upstream patch targeted for 7.4 to extend the\u000aRealtek SPI driver with support for the second CS. Though no devices\u000amade use of this so far, further devices may do so.\u000a\u000aLink: https://github.com/openwrt/openwrt/pull/25334\u000aSigned-off-by: Jonas Jelonek <jonas@jonasjelonek.de>\u000a",
        "date" : "2026-09-23 09:42:46 +0200",
        "id" : "c09e3f28ba110394a1aa4b765d73a4b53e7c90b6",
        "msg" : "realtek: spi: backport patch to support second SPI CS",
        "paths" : [
          {
            "editType" : "add",
            "file" : "target/linux/realtek/patches-6.18/040-v7.4-spi-realtek-rtl-add-support-for-second-CS.patch"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tools/yafut/patches/100-honour-SOURCE_DATE_EPOCH.patch"
        ],
        "commitId" : "d5c26afe3336e6a2602f3f90e62dff5f4ec81b84",
        "timestamp" : 1790157519000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/nbd",
          "fullName" : "nbd"
        },
        "authorEmail" : "nbd@nbd.name",
        "comment" : "tools/yafut: refresh patch\u000a\u000aRefresh 100-honour-SOURCE_DATE_EPOCH.patch\u000a\u000aSigned-off-by: Felix Fietkau <nbd@nbd.name>\u000a",
        "date" : "2026-09-23 11:58:39 +0200",
        "id" : "d5c26afe3336e6a2602f3f90e62dff5f4ec81b84",
        "msg" : "tools/yafut: refresh patch",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tools/yafut/patches/100-honour-SOURCE_DATE_EPOCH.patch"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/qualcommax/dts/ipq6018-mr7500.dts"
        ],
        "commitId" : "fa6c94b6e963e5c043da208eb9661240fe346593",
        "timestamp" : 1790163445000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robimarko",
          "fullName" : "robimarko"
        },
        "authorEmail" : "robimarko@gmail.com",
        "comment" : "qualcommax: ipq60xx: add AQR114C reset delays for MR7500\u000a\u000aThe AQR114C requires time after reset deassertion before it is\u000aready to respond on the MDIO bus. Add reset-assert-us and\u000areset-deassert-us to ensure reliable PHY enumeration on boot.\u000a\u000aSigned-off-by: Ross Barnes-Brown <true.robot.ross@gmail.com>\u000aLink: https://github.com/openwrt/openwrt/pull/24055\u000aSigned-off-by: Robert Marko <robimarko@gmail.com>\u000a",
        "date" : "2026-09-23 13:37:25 +0200",
        "id" : "fa6c94b6e963e5c043da208eb9661240fe346593",
        "msg" : "qualcommax: ipq60xx: add AQR114C reset delays for MR7500",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/qualcommax/dts/ipq6018-mr7500.dts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/boot/uboot-microchipsw/patches/0007-mmc-atmel-sdhci-add-support-for-LAN969x.patch",
          "package/boot/uboot-microchipsw/src/board/microchip/lan969x/lan969x.env",
          "package/boot/uboot-microchipsw/patches/0002-pinctrl-add-Microchip-LAN969x-driver.patch",
          "package/boot/uboot-microchipsw/patches/0013-net-phy-add-Microchip-LAN8841-support.patch",
          "package/boot/uboot-microchipsw/patches/0008-i2c-at91-i2c-include-arch-specific-clk.h-only-for-AT.patch",
          "package/boot/uboot-microchipsw/patches/0010-usb-dwc3-generic-add-support-for-Microchip-LAN969x.patch",
          "package/boot/uboot-microchipsw/patches/0006-mmc-atmel-sdhci-include-arch-specific-clk.h-only-for.patch",
          "package/boot/uboot-microchipsw/patches/0003-clk-add-Microchip-LAN966x-and-LAN969x-support.patch",
          "package/boot/uboot-microchipsw/patches/0011-spi-atmel-quadspi-add-Microchip-LAN969x-support.patch",
          "package/boot/uboot-microchipsw/patches/0017-cmd-add-imsz-and-imszb.patch",
          "package/boot/uboot-microchipsw/patches/200-cmd-add-imsz-and-imszb.patch",
          "package/boot/uboot-microchipsw/patches/0005-mmc-atmel-sdhci-set-GCK-rate-based-on-compatible.patch",
          "package/boot/uboot-microchipsw/patches/0004-mmc-atmel-remove-duplicate-depends-on-ARCH_AT91.patch",
          "package/boot/uboot-microchipsw/patches/0014-arch-arm-add-Microchip-LAN969x-support.patch",
          "package/boot/uboot-microchipsw/patches/0016-microchip-lan969x-add-OpenWrt-default-environment.patch",
          "package/boot/uboot-microchipsw/patches/0012-net-add-Microchip-SparX-5-and-LAN969x-support.patch",
          "package/boot/uboot-microchipsw/patches/0015-arm-microchipsw-add-Novarq-Tactical-1000.patch",
          "package/boot/uboot-microchipsw/Makefile",
          "package/boot/uboot-microchipsw/patches/0001-serial-atmel-usart-allow-selecting-from-ARCH_MICROCH.patch",
          "package/boot/uboot-microchipsw/patches/0009-i2c-i2c-at91-allow-selecting-from-ARCH_MICROCHIPSW.patch"
        ],
        "commitId" : "1f89cfd70159a3ff9ecf62fc5bcb3455abcba88c",
        "timestamp" : 1790168948000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robert.marko",
          "fullName" : "robert.marko"
        },
        "authorEmail" : "robert.marko@sartura.hr",
        "comment" : "boot: uboot-microchipsw: use mainline U-Boot\u000a\u000aUse mainline U-Boot with pending patches for LAN969x instead of the\u000aold vendor U-Boot.\u000a\u000aBoth existing boards are supported.\u000a\u000aSigned-off-by: Robert Marko <robert.marko@sartura.hr>\u000a",
        "date" : "2026-09-23 15:09:08 +0200",
        "id" : "1f89cfd70159a3ff9ecf62fc5bcb3455abcba88c",
        "msg" : "boot: uboot-microchipsw: use mainline U-Boot",
        "paths" : [
          {
            "editType" : "add",
            "file" : "package/boot/uboot-microchipsw/patches/0001-serial-atmel-usart-allow-selecting-from-ARCH_MICROCH.patch"
          },
          {
            "editType" : "edit",
            "file" : "package/boot/uboot-microchipsw/Makefile"
          },
          {
            "editType" : "add",
            "file" : "package/boot/uboot-microchipsw/patches/0006-mmc-atmel-sdhci-include-arch-specific-clk.h-only-for.patch"
          },
          {
            "editType" : "add",
            "file" : "package/boot/uboot-microchipsw/patches/0015-arm-microchipsw-add-Novarq-Tactical-1000.patch"
          },
          {
            "editType" : "add",
            "file" : "package/boot/uboot-microchipsw/patches/0005-mmc-atmel-sdhci-set-GCK-rate-based-on-compatible.patch"
          },
          {
            "editType" : "add",
            "file" : "package/boot/uboot-microchipsw/patches/0014-arch-arm-add-Microchip-LAN969x-support.patch"
          },
          {
            "editType" : "delete",
            "file" : "package/boot/uboot-microchipsw/src/board/microchip/lan969x/lan969x.env"
          },
          {
            "editType" : "add",
            "file" : "package/boot/uboot-microchipsw/patches/0011-spi-atmel-quadspi-add-Microchip-LAN969x-support.patch"
          },
          {
            "editType" : "add",
            "file" : "package/boot/uboot-microchipsw/patches/0002-pinctrl-add-Microchip-LAN969x-driver.patch"
          },
          {
            "editType" : "add",
            "file" : "package/boot/uboot-microchipsw/patches/0009-i2c-i2c-at91-allow-selecting-from-ARCH_MICROCHIPSW.patch"
          },
          {
            "editType" : "add",
            "file" : "package/boot/uboot-microchipsw/patches/0003-clk-add-Microchip-LAN966x-and-LAN969x-support.patch"
          },
          {
            "editType" : "add",
            "file" : "package/boot/uboot-microchipsw/patches/0008-i2c-at91-i2c-include-arch-specific-clk.h-only-for-AT.patch"
          },
          {
            "editType" : "add",
            "file" : "package/boot/uboot-microchipsw/patches/0013-net-phy-add-Microchip-LAN8841-support.patch"
          },
          {
            "editType" : "delete",
            "file" : "package/boot/uboot-microchipsw/patches/200-cmd-add-imsz-and-imszb.patch"
          },
          {
            "editType" : "add",
            "file" : "package/boot/uboot-microchipsw/patches/0007-mmc-atmel-sdhci-add-support-for-LAN969x.patch"
          },
          {
            "editType" : "add",
            "file" : "package/boot/uboot-microchipsw/patches/0016-microchip-lan969x-add-OpenWrt-default-environment.patch"
          },
          {
            "editType" : "add",
            "file" : "package/boot/uboot-microchipsw/patches/0004-mmc-atmel-remove-duplicate-depends-on-ARCH_AT91.patch"
          },
          {
            "editType" : "add",
            "file" : "package/boot/uboot-microchipsw/patches/0017-cmd-add-imsz-and-imszb.patch"
          },
          {
            "editType" : "add",
            "file" : "package/boot/uboot-microchipsw/patches/0010-usb-dwc3-generic-add-support-for-Microchip-LAN969x.patch"
          },
          {
            "editType" : "add",
            "file" : "package/boot/uboot-microchipsw/patches/0012-net-add-Microchip-SparX-5-and-LAN969x-support.patch"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tools/cmake/Makefile",
          "tools/cmake/patches/150-zstd-libarchive.patch"
        ],
        "commitId" : "ad71bfef7e5c1c4e1579f6469110babb7e973d9b",
        "timestamp" : 1790169479000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robimarko",
          "fullName" : "robimarko"
        },
        "authorEmail" : "robimarko@gmail.com",
        "comment" : "tools/cmake: pass zstd paths to bootstrap\u000a\u000aInstead of carrying a patch (150-zstd-libarchive.patch) that modifies\u000aUtilities/cmlibarchive/CMakeLists.txt to enable pkg-config search for\u000azstd, pass explicit staging library and include paths (-DZSTD_INCLUDE_DIR\u000aand -DZSTD_LIBRARY) directly to CMake's bootstrap script.\u000a\u000aZSTD_INCLUDE_DIR and ZSTD_LIBRARY are the cache variables CMake itself\u000asets when --system-zstd is not used, so pre-seeding them guarantees that\u000aCMake always links against OpenWrt's staging libzstd without requiring\u000aa patch.\u000a\u000aFixes: 0e3d51ccaedf (\"tools/cmake: fix compilation with host libzstd-dev\")\u000aSuggested-by: Michael Pratt <mcpratt@pm.me>\u000aSigned-off-by: Josef Schlehofer <pepe.schlehofer@gmail.com>\u000aLink: https://github.com/openwrt/openwrt/pull/24407\u000aSigned-off-by: Robert Marko <robimarko@gmail.com>\u000a",
        "date" : "2026-09-23 15:17:59 +0200",
        "id" : "ad71bfef7e5c1c4e1579f6469110babb7e973d9b",
        "msg" : "tools/cmake: pass zstd paths to bootstrap",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tools/cmake/Makefile"
          },
          {
            "editType" : "delete",
            "file" : "tools/cmake/patches/150-zstd-libarchive.patch"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "include/cmake.mk",
          "tools/cmake/patches/100-no-testing.patch",
          "tools/cmake/Makefile"
        ],
        "commitId" : "ddb23f3a0223d1280bd674ea7fe4b1dedde22997",
        "timestamp" : 1790173765000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robimarko",
          "fullName" : "robimarko"
        },
        "authorEmail" : "robimarko@gmail.com",
        "comment" : "tools/cmake: pass -DBUILD_TESTING=OFF to bootstrap\u000a\u000aInstead of carrying 100-no-testing.patch, pass -DBUILD_TESTING=OFF\u000adirectly to CMake's bootstrap script. This avoids refreshing the patch\u000aon every CMake update.\u000a\u000aThe patch also changed the default in the installed CTest.cmake module.\u000aPreserve that behavior by passing -DBUILD_TESTING=OFF by default in\u000acmake.mk for target and host builds. Packages can override it via\u000aCMAKE_OPTIONS or CMAKE_HOST_OPTIONS.\u000a\u000aOpenWrt never runs CMake tests, so building them only wastes build time.\u000a\u000aThis replaces the patch introduced in 8af80e79bd5b (\"tools/cmake:\u000aupdate to 3.17.0\").\u000a\u000aSigned-off-by: Josef Schlehofer <pepe.schlehofer@gmail.com>\u000aLink: https://github.com/openwrt/openwrt/pull/24403\u000aSigned-off-by: Robert Marko <robimarko@gmail.com>\u000a",
        "date" : "2026-09-23 16:29:25 +0200",
        "id" : "ddb23f3a0223d1280bd674ea7fe4b1dedde22997",
        "msg" : "tools/cmake: pass -DBUILD_TESTING=OFF to bootstrap",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "include/cmake.mk"
          },
          {
            "editType" : "delete",
            "file" : "tools/cmake/patches/100-no-testing.patch"
          },
          {
            "editType" : "edit",
            "file" : "tools/cmake/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tools/cmake/Makefile"
        ],
        "commitId" : "e4f2ae3b8d797395f4763cb6d225911795a992ec",
        "timestamp" : 1790175463000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robimarko",
          "fullName" : "robimarko"
        },
        "authorEmail" : "robimarko@gmail.com",
        "comment" : "tools/cmake: pass testing option after bootstrap separator\u000a\u000aHost/Configure/Default supplies the bootstrap \"--\" separator before\u000aCMAKE_HOST_OPTIONS. Keep BUILD_TESTING with the CMake cache options so\u000ait is passed after that separator, without introducing a second one.\u000a\u000aFixes: ddb23f3a0223d (\"tools/cmake: pass -DBUILD_TESTING=OFF to bootstrap\")\u000aSigned-off-by: Robert Marko <robimarko@gmail.com>\u000a",
        "date" : "2026-09-23 16:57:43 +0200",
        "id" : "e4f2ae3b8d797395f4763cb6d225911795a992ec",
        "msg" : "tools/cmake: pass testing option after bootstrap separator",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tools/cmake/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/devel/valgrind/Makefile"
        ],
        "commitId" : "da415b6a69ebd98a5a58cceb058dd8273475c6d7",
        "timestamp" : 1790175721000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robimarko",
          "fullName" : "robimarko"
        },
        "authorEmail" : "robimarko@gmail.com",
        "comment" : "valgrind: fix ARMv7 detection on AArch64\u000a\u000aThe mvebu target enables CONFIG_CPU_V7 even for AArch64 subtargets,\u000awhich also causes CONFIG_arm_v7 to be set. This makes Valgrind use\u000athe ARMv7 configure host triplet on AArch64, breaking the build.\u000a\u000aOnly apply the ARMv7 host override when ARCH is arm.\u000a\u000aSigned-off-by: Tianling Shen <cnsztl@immortalwrt.org>\u000aLink: https://github.com/openwrt/openwrt/pull/25346\u000aSigned-off-by: Robert Marko <robimarko@gmail.com>\u000a",
        "date" : "2026-09-23 17:02:01 +0200",
        "id" : "da415b6a69ebd98a5a58cceb058dd8273475c6d7",
        "msg" : "valgrind: fix ARMv7 detection on AArch64",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/devel/valgrind/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/patches-6.18/743-net-realtek-serdes-configuration.patch",
          "target/linux/realtek/patches-6.18/024-02-v7.1-net-phy-realtek-add-RTL8224-pair-order-support.patch",
          "target/linux/realtek/patches-6.18/024-04-v7.1-net-phy-realtek-add-RTL8224-polarity-support.patch",
          "target/linux/realtek/patches-6.18/030-v7.2-net-phy-realtek-support-MDI-swapping-for-RTL8226-CG.patch",
          "target/linux/generic/pending-6.18/743-net-phy-realtek-reset-RTL8261N-USXGMII-SerDes-on-lin.patch",
          "target/linux/generic/pending-6.18/742-net-phy-realtek-add-5G-and-10G-PHY-support.patch"
        ],
        "commitId" : "76da1ee259c5804e105c3f044fcf94833608b227",
        "timestamp" : 1790184476000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/jonas",
          "fullName" : "jonas"
        },
        "authorEmail" : "jonas@jonasjelonek.de",
        "comment" : "generic: harden RTL826x PHY match, EEE and soft-reset\u000a\u000aRequire PKG_MODEL 0x8261 for RTL8261BE/N probe matching.  Extend\u000aEEE disable in rtl826x_probe() to multi-G speeds for PHYs without\u000aa device-tree node (e.g. SFP cage modules).  Wait the datasheet t7\u000aminimum (150 ms) after MMD30 soft-reset before applying firmware\u000apatches.\u000a\u000aFixes 10G link flapping on Spectrum SBE1V1K (RTL8261BE).\u000a\u000aAlso exercised on BPi-R4 with a ZYOPM SFP+ RTL8261BE module.\u000a\u000aTested-by: Andrew LaMarche <andrewjlamarche@gmail.com>\u000aLink: https://forum.openwrt.org/t/spectrum-sbe1v1k-ipq9574-openwrt-support/245244/190\u000a\u000aSigned-off-by: Daniel Pawlik <pawlik.dan@gmail.com>\u000aLink: https://github.com/openwrt/openwrt/pull/24887\u000aSigned-off-by: Jonas Jelonek <jonas@jonasjelonek.de>\u000a",
        "date" : "2026-09-23 19:27:56 +0200",
        "id" : "76da1ee259c5804e105c3f044fcf94833608b227",
        "msg" : "generic: harden RTL826x PHY match, EEE and soft-reset",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/generic/pending-6.18/743-net-phy-realtek-reset-RTL8261N-USXGMII-SerDes-on-lin.patch"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/patches-6.18/743-net-realtek-serdes-configuration.patch"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/patches-6.18/024-02-v7.1-net-phy-realtek-add-RTL8224-pair-order-support.patch"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/patches-6.18/030-v7.2-net-phy-realtek-support-MDI-swapping-for-RTL8226-CG.patch"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/generic/pending-6.18/742-net-phy-realtek-add-5G-and-10G-PHY-support.patch"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/patches-6.18/024-04-v7.1-net-phy-realtek-add-RTL8224-polarity-support.patch"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c"
        ],
        "commitId" : "cc83970a16200b453ae2363520151cad1e30ac9a",
        "timestamp" : 1790184620000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/jonas",
          "fullName" : "jonas"
        },
        "authorEmail" : "jonas@jonasjelonek.de",
        "comment" : "realtek: pcs: rtl93xx: name common SerDes registers and fields\u000a\u000aDocument SerDes registers and fields shared by RTL930x and RTL931x.\u000aReplace magic offsets and bit ranges at their call sites with the named\u000aregisters and field masks.\u000a\u000aLink: https://github.com/openwrt/openwrt/pull/25314\u000aSigned-off-by: Jonas Jelonek <jonas@jonasjelonek.de>\u000a",
        "date" : "2026-09-23 19:30:20 +0200",
        "id" : "cc83970a16200b453ae2363520151cad1e30ac9a",
        "msg" : "realtek: pcs: rtl93xx: name common SerDes registers and fields",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c"
        ],
        "commitId" : "be387779344c4cecaae5b3382945e7f67618f583",
        "timestamp" : 1790184621000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/jonas",
          "fullName" : "jonas"
        },
        "authorEmail" : "jonas@jonasjelonek.de",
        "comment" : "realtek: pcs: rtl930x: name SerDes registers and fields\u000a\u000aDocument RTL930x SerDes registers and fields, then replace magic offsets\u000aand bit ranges at their call sites. Use FIELD_PREP() where values need\u000apositioning and named masks for field updates.\u000a\u000aLink: https://github.com/openwrt/openwrt/pull/25314\u000aSigned-off-by: Jonas Jelonek <jonas@jonasjelonek.de>\u000a",
        "date" : "2026-09-23 19:30:21 +0200",
        "id" : "be387779344c4cecaae5b3382945e7f67618f583",
        "msg" : "realtek: pcs: rtl930x: name SerDes registers and fields",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c"
        ],
        "commitId" : "c1b568dbd7b297120e9df587acc56847c37159a3",
        "timestamp" : 1790184621000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/jonas",
          "fullName" : "jonas"
        },
        "authorEmail" : "jonas@jonasjelonek.de",
        "comment" : "realtek: pcs: rtl931x: name SerDes registers and fields\u000a\u000aDocument RTL931x SerDes registers and fields, then replace magic offsets\u000aand bit ranges at their call sites. Use FIELD_PREP() where values need\u000apositioning and named masks for field updates.\u000a\u000aLink: https://github.com/openwrt/openwrt/pull/25314\u000aSigned-off-by: Jonas Jelonek <jonas@jonasjelonek.de>\u000a",
        "date" : "2026-09-23 19:30:21 +0200",
        "id" : "c1b568dbd7b297120e9df587acc56847c37159a3",
        "msg" : "realtek: pcs: rtl931x: name SerDes registers and fields",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c"
        ],
        "commitId" : "b532485b4e74cd6d112d7286a7068677080d9cde",
        "timestamp" : 1790184621000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/jonas",
          "fullName" : "jonas"
        },
        "authorEmail" : "jonas@jonasjelonek.de",
        "comment" : "realtek: pcs: rtl83xx: name the SerDes soft reset field\u000a\u000aDocument the common SerDes soft-reset register and field. Replace magic\u000aregister values in the RTL838x and RTL839x reset sequences with named,\u000aSDK-style masked field updates. Merge the two sequences by dropping the\u000aRTL839x-specific delay - which is unneeded according to the SDK - and\u000aprovide a combined helper.\u000a\u000aLink: https://github.com/openwrt/openwrt/pull/25314\u000aSigned-off-by: Jonas Jelonek <jonas@jonasjelonek.de>\u000a",
        "date" : "2026-09-23 19:30:21 +0200",
        "id" : "b532485b4e74cd6d112d7286a7068677080d9cde",
        "msg" : "realtek: pcs: rtl83xx: name the SerDes soft reset field",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c"
        ],
        "commitId" : "4cf738158f88ad961a8873c79b1f25d8a633878a",
        "timestamp" : 1790184622000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/jonas",
          "fullName" : "jonas"
        },
        "authorEmail" : "jonas@jonasjelonek.de",
        "comment" : "realtek: pcs: rtl930x: simplify XSG writes\u000a\u000aXSG fan-out is only required for the low digital pages on SerDes 2 and\u000a3. Apply the analog configuration tables through the normal write path\u000aand remove the now-unused XSG table helper.\u000a\u000aLimit the XSG operation to its supported targets, reuse the normal\u000aRTL930x write for the first SerDes, and derive the companion from the\u000aexisting physical mapping.\u000a\u000aLink: https://github.com/openwrt/openwrt/pull/25314\u000aSigned-off-by: Jonas Jelonek <jonas@jonasjelonek.de>\u000a",
        "date" : "2026-09-23 19:30:22 +0200",
        "id" : "4cf738158f88ad961a8873c79b1f25d8a633878a",
        "msg" : "realtek: pcs: rtl930x: simplify XSG writes",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c"
        ],
        "commitId" : "76d313b2c60578948e68ec2994f671c7637243e3",
        "timestamp" : 1790184622000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/jonas",
          "fullName" : "jonas"
        },
        "authorEmail" : "jonas@jonasjelonek.de",
        "comment" : "realtek: pcs: rtl930x: coalesce TX amplitude updates\u000a\u000aProgram impedance, pre-amplitude, and post-amplitude in that order so\u000adependent enable state is not exposed before its coefficient.\u000a\u000aThen update the main amplitude and both enable bits together. This\u000areplaces three REG07 read-modify-write transactions with one.\u000a\u000aLink: https://github.com/openwrt/openwrt/pull/25314\u000aSigned-off-by: Jonas Jelonek <jonas@jonasjelonek.de>\u000a",
        "date" : "2026-09-23 19:30:22 +0200",
        "id" : "76d313b2c60578948e68ec2994f671c7637243e3",
        "msg" : "realtek: pcs: rtl930x: coalesce TX amplitude updates",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c"
        ],
        "commitId" : "3c80700e134d75fdd16194ad51eb3ce693355056",
        "timestamp" : 1790184622000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/jonas",
          "fullName" : "jonas"
        },
        "authorEmail" : "jonas@jonasjelonek.de",
        "comment" : "realtek: pcs: rtl930x: coalesce RX VTH updates\u000a\u000aThe positive and negative VTH values occupy disjoint fields in the same\u000aregister. Combine them into one masked read-modify-write instead of\u000aupdating each field separately.\u000a\u000aLink: https://github.com/openwrt/openwrt/pull/25314\u000aSigned-off-by: Jonas Jelonek <jonas@jonasjelonek.de>\u000a",
        "date" : "2026-09-23 19:30:22 +0200",
        "id" : "3c80700e134d75fdd16194ad51eb3ce693355056",
        "msg" : "realtek: pcs: rtl930x: coalesce RX VTH updates",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/bcm53xx/Makefile"
        ],
        "commitId" : "d2a80cdbd8060f9ec4de36f19769274d2712114b",
        "timestamp" : 1790189037000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/jonas",
          "fullName" : "jonas"
        },
        "authorEmail" : "jonas@jonasjelonek.de",
        "comment" : "bcm53xx: switch to 6.18\u000a\u000aPromote kernel 6.18 to the default KERNEL_PATCHVER for bcm53xx and\u000adrop the KERNEL_TESTING_PATCHVER entry, since 6.18 is no longer the\u000atesting kernel.\u000a\u000aSigned-off-by: Rosen Penev <rosenp@gmail.com>\u000aLink: https://github.com/openwrt/openwrt/pull/25307\u000aSigned-off-by: Jonas Jelonek <jonas@jonasjelonek.de>\u000a",
        "date" : "2026-09-23 20:43:57 +0200",
        "id" : "d2a80cdbd8060f9ec4de36f19769274d2712114b",
        "msg" : "bcm53xx: switch to 6.18",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/bcm53xx/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/bcm53xx/patches-6.12/321-v7.1-ARM-dts-BCM5301X-EA9200-add-USB-GPIOs.patch",
          "target/linux/bcm53xx/patches-6.12/500-UBI-Detect-EOF-mark-and-erase-all-remaining-blocks.patch",
          "target/linux/bcm53xx/patches-6.12/326-ARM-dts-BCM5301X-EA9200-use-network-LED-trigger.patch",
          "target/linux/bcm53xx/patches-6.12/325-ARM-dts-BCM5301X-EA9200-set-MAC-from-nvram.patch",
          "target/linux/bcm53xx/patches-6.12/314-ARM-dts-BCM5301X-EA6300-specify-switch.patch",
          "target/linux/bcm53xx/patches-6.12/300-ARM-BCM5301X-Disable-MMU-and-Dcache-during-decompres.patch",
          "target/linux/bcm53xx/patches-6.12/140-mtd-parsers-trx-parse-firmware-MTD-partitions-only.patch",
          "target/linux/bcm53xx/patches-6.12/324-ARM-dts-BCM5301X-EA9200-add-wifi-definitions.patch",
          "target/linux/bcm53xx/patches-6.12/304-ARM-dts-BCM5301X-Specify-switch-ports-for-remaining-.patch",
          "target/linux/bcm53xx/config-6.12",
          "target/linux/bcm53xx/patches-6.12/320-v7.1-ARM-dts-BCM5301X-EA9200-add-WiFi-button.patch",
          "target/linux/bcm53xx/patches-6.12/352-ARM-dts-BCM5301X-EA9200-fix-nvram-size.patch",
          "target/linux/bcm53xx/patches-6.12/050-v6.13-ARM-dts-meraki-mr26-set-mac-address-for-gmac0.patch",
          "target/linux/bcm53xx/patches-6.12/360-v7.2-ARM-dts-BCM5301X-R6300v2-fix-USB3.patch",
          "target/linux/bcm53xx/patches-6.12/323-v7.1-ARM-dts-BCM5301X-EA9200-specify-partitions.patch",
          "target/linux/bcm53xx/patches-6.12/312-v7.1-ARM-dts-BCM5301X-panamera-set-WAN-MAC-from-nvram.patch",
          "target/linux/bcm53xx/patches-6.12/349-v7.1-ARM-dts-BCM5301X-Describe-PCIe-controllers-fully.patch",
          "target/linux/bcm53xx/patches-6.12/340-meraki-mx6x-mac-base.patch",
          "target/linux/bcm53xx/patches-6.12/315-ARM-dts-BCM5301X-phicomm-k3-specify-switch.patch",
          "target/linux/bcm53xx/patches-6.12/322-v7.1-ARM-dts-BCM5301X-EA9200-add-LEDs.patch",
          "target/linux/bcm53xx/patches-6.12/313-ARM-dts-BCM5301X-AC87U-specify-switch.patch",
          "target/linux/bcm53xx/patches-6.12/333-bcm53xx-dts-meraki-mx6x-add-OpenWrt-specific-LED-ali.patch",
          "target/linux/bcm53xx/patches-6.12/311-v7.1-ARM-dts-BCM5301X-EA9200-set-WAN-MAC-from-nvram.patch",
          "target/linux/bcm53xx/patches-6.12/180-usb-xhci-add-support-for-performing-fake-doorbell.patch",
          "target/linux/bcm53xx/patches-6.12/332-Meraki-MX6X-partition-fixups.patch",
          "target/linux/bcm53xx/patches-6.12/331-v7.2-ARM-dts-NSP-Move-MX6X-pinctrl-config-to-PWM-node.patch",
          "target/linux/bcm53xx/patches-6.12/361-v7.2-ARM-dts-BCM5301X-EA6500v2-fix-USB3.patch",
          "target/linux/bcm53xx/patches-6.12/701-net-dsa-b53-disable-EAP-setup-on-Northstar-switches.patch",
          "target/linux/bcm53xx/patches-6.12/351-PCI-iproc-Use-the-EROM-outbound-window-on-BCMA.patch",
          "target/linux/bcm53xx/patches-6.12/350-v7.1-ARM-dts-BCM5301X-add-root-pcie-bridges.patch",
          "target/linux/bcm53xx/patches-6.12/310-ARM-BCM5301X-Add-DT-for-Netgear-R7900.patch",
          "target/linux/bcm53xx/patches-6.12/051-ARM-dts-meraki-mr26-wifi-MACs-in-dts.patch",
          "target/linux/bcm53xx/patches-6.12/905-BCM53573-minor-hacks.patch"
        ],
        "commitId" : "6a31f03522f5cbb829b9078863096058c82767fc",
        "timestamp" : 1790189037000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/jonas",
          "fullName" : "jonas"
        },
        "authorEmail" : "jonas@jonasjelonek.de",
        "comment" : "bcm53xx: remove 6.12 files\u000a\u000aNow that 6.18 is the only supported kernel version for bcm53xx,\u000aremove the 6.12 kernel configs (config-6.12 and per-subtarget\u000aconfig-6.12 files) and the entire patches-6.12 patch stack, as they\u000aare no longer used.\u000a\u000aSigned-off-by: Rosen Penev <rosenp@gmail.com>\u000aLink: https://github.com/openwrt/openwrt/pull/25307\u000aSigned-off-by: Jonas Jelonek <jonas@jonasjelonek.de>\u000a",
        "date" : "2026-09-23 20:43:57 +0200",
        "id" : "6a31f03522f5cbb829b9078863096058c82767fc",
        "msg" : "bcm53xx: remove 6.12 files",
        "paths" : [
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/314-ARM-dts-BCM5301X-EA6300-specify-switch.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/322-v7.1-ARM-dts-BCM5301X-EA9200-add-LEDs.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/304-ARM-dts-BCM5301X-Specify-switch-ports-for-remaining-.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/140-mtd-parsers-trx-parse-firmware-MTD-partitions-only.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/326-ARM-dts-BCM5301X-EA9200-use-network-LED-trigger.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/351-PCI-iproc-Use-the-EROM-outbound-window-on-BCMA.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/320-v7.1-ARM-dts-BCM5301X-EA9200-add-WiFi-button.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/311-v7.1-ARM-dts-BCM5301X-EA9200-set-WAN-MAC-from-nvram.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/051-ARM-dts-meraki-mr26-wifi-MACs-in-dts.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/352-ARM-dts-BCM5301X-EA9200-fix-nvram-size.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/340-meraki-mx6x-mac-base.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/324-ARM-dts-BCM5301X-EA9200-add-wifi-definitions.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/333-bcm53xx-dts-meraki-mx6x-add-OpenWrt-specific-LED-ali.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/500-UBI-Detect-EOF-mark-and-erase-all-remaining-blocks.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/361-v7.2-ARM-dts-BCM5301X-EA6500v2-fix-USB3.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/350-v7.1-ARM-dts-BCM5301X-add-root-pcie-bridges.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/905-BCM53573-minor-hacks.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/331-v7.2-ARM-dts-NSP-Move-MX6X-pinctrl-config-to-PWM-node.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/701-net-dsa-b53-disable-EAP-setup-on-Northstar-switches.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/310-ARM-BCM5301X-Add-DT-for-Netgear-R7900.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/050-v6.13-ARM-dts-meraki-mr26-set-mac-address-for-gmac0.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/325-ARM-dts-BCM5301X-EA9200-set-MAC-from-nvram.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/180-usb-xhci-add-support-for-performing-fake-doorbell.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/313-ARM-dts-BCM5301X-AC87U-specify-switch.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/312-v7.1-ARM-dts-BCM5301X-panamera-set-WAN-MAC-from-nvram.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/315-ARM-dts-BCM5301X-phicomm-k3-specify-switch.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/300-ARM-BCM5301X-Disable-MMU-and-Dcache-during-decompres.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/321-v7.1-ARM-dts-BCM5301X-EA9200-add-USB-GPIOs.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/config-6.12"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/332-Meraki-MX6X-partition-fixups.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/323-v7.1-ARM-dts-BCM5301X-EA9200-specify-partitions.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/360-v7.2-ARM-dts-BCM5301X-R6300v2-fix-USB3.patch"
          },
          {
            "editType" : "delete",
            "file" : "target/linux/bcm53xx/patches-6.12/349-v7.1-ARM-dts-BCM5301X-Describe-PCIe-controllers-fully.patch"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/net/phy/realtek/realtek_multiport.c"
        ],
        "commitId" : "2c9a3999e452135fbc1e2be906832d7e77d1fda6",
        "timestamp" : 1790190608000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/jonas",
          "fullName" : "jonas"
        },
        "authorEmail" : "jonas@jonasjelonek.de",
        "comment" : "realtek: phy: fix RTL8218E second XSGMII channel group\u000a\u000aThe RTL8218E exposes XSGMII as one logical SerDes, but its eight\u000aMAC-side channels are represented by two groups of four. The initial\u000asetup disables autonegotiation only for the first group on page 0x400,\u000aleaving the second group on page 0x500 in autonegotiation mode.\u000a\u000aConsequently, the first four package ports pass traffic while the\u000aremaining four establish copper link but do not pass packets. Disable\u000aXSGMII autonegotiation for the second group as well by forcing\u000aregister 0x500.12[9:8] to 01.\u000a\u000aThis changes 0x500.12 from 0x70d0 to 0x71d0 and brings\u000a0x507.15[7:4] from 0 to 0xf on hardware, after which all eight ports\u000apass traffic.\u000a\u000aFixes: 2db820be865f (\"realtek: phy: fix RTL8218E XSGMII initialization\")\u000aAssisted-by: ChatGPT (OpenAI GPT-5.6 Sol)\u000aLink: https://github.com/openwrt/openwrt/pull/25364\u000aSigned-off-by: Jonas Jelonek <jonas@jonasjelonek.de>\u000a",
        "date" : "2026-09-23 21:10:08 +0200",
        "id" : "2c9a3999e452135fbc1e2be906832d7e77d1fda6",
        "msg" : "realtek: phy: fix RTL8218E second XSGMII channel group",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/phy/realtek/realtek_multiport.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/base-files/etc/board.d/02_network",
          "target/linux/realtek/image/rtl930x.mk",
          "target/linux/realtek/dts/rtl9302_ubnt_usw-pro-max-24-poe.dts"
        ],
        "commitId" : "98f3808362bec6dc5eee0479be7f4239efbfa91e",
        "timestamp" : 1790190901000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/jonas",
          "fullName" : "jonas"
        },
        "authorEmail" : "jonas@jonasjelonek.de",
        "comment" : "realtek: add support for Ubiquiti UniFi USW Pro Max 24 PoE\u000a\u000aAdd support for RTL9302B-based Ubiquiti UniFi USW Pro Max 24 PoE switch\u000awith 16x GbE and 8x 2.5G RJ45 ports, 2x SFP+, and a front display.\u000a\u000aHardware\u000a========\u000a\u000a  - RTL9302B switch SoC\u000a  - 512 MiB RAM\u000a  - 32 MiB SPI-NOR flash\u000a  - 16x 100M/1G RJ45 ports via 2x RTL8218E\u000a  - 8x 100M/1G/2.5G RJ45 ports via 2x RTL8224\u000a  - PoE:\u000a      - 400W total budget\u000a      - 8x 802.3at, 32W per port (ports 1-8)\u000a      - 16x 802.3bt, 60W per port (ports 9-24)\u000a  - 2x SFP+ ports\u000a  - Buttons: 1x Reset\u000a  - LEDs: RGBW LED per port (Etherlighting)\u000a  - Front touch display via USB ACM (see below)\u000a  - Console: TTL 3.3V, 115200 8N1 (internal pin header close to SoC;\u000a    layout front to back: VCC RX TX GND)\u000a  - Etherlighting feature (lighting patterns and color control)\u000a  - Vendor firmware: U-Boot + LEDE-based Ubiquiti OS\u000a\u000aMAC address\u000a===========\u000a\u000aSingle MAC address in EEPROM partition, applied to all ports.\u000a\u000aFront touch display\u000a===================\u000a\u000aThe unit has a touch-capable front display, driven by a dedicated\u000aSTM32-based MCU. Unlike other Ubiquiti switches where the MCU is\u000aconnected to the SoC via UART directly, here it is exposed as a USB\u000aCDC-ACM serial device through an on-board Genesys Logic GL850G USB hub.\u000aThe MCU runs Ubiquiti's LCM firmware and exposes a high-level JSON\u000aprotocol (page selection, button-press events, etc.); arbitrary\u000apixel-level control is not possible without replacing the MCU firmware.\u000aDisplay support therefore depends on both USB host support and a driver\u000afor the LCM protocol, neither of which is currently available.\u000a\u000aKnown issues\u000a============\u000a\u000a  - Etherlighting not controllable, driver WIP. Port LEDs for link work\u000a    though. By default, the controller keeps the LEDs in a breathing\u000a    state, gated by the link state delivered by the Realtek SoC.\u000a\u000aDisclaimer\u000a==========\u000a\u000aStock firmware uses a dual-bank layout (kernel0/kernel1, ~15 MiB each).\u000aOpenWrt replaces both banks with a single contiguous firmware partition.\u000aFlashing OpenWrt writes or invalidates both stock kernel slots; U-Boot\u000aremains intact and can be used for recovery.\u000a\u000aInstallation\u000a============\u000a\u000a1. Enable SSH on the stock UniFi OS and log in with user account.\u000a\u000a2. Copy the OpenWrt sysupgrade image to /tmp on the switch (e.g. via\u000a   scp).\u000a\u000a3. Adjust IMG below to point at the copied file, then run the block as a\u000a   whole. It verifies the expected stock partition layout and image size,\u000a   writes kernel0, splits into kernel1 if the image is larger than that\u000a   slot (otherwise invalidates kernel1 so U-Boot cannot pick a stale\u000a   bank), and reboots:\u000a\u000a   set -e\u000a   IMG=/tmp/openwrt-realtek-rtl930x-ubnt_usw-pro-max-24-poe-squashfs-sysupgrade.bin\u000a   K0_SIZE=$((0xf10000))\u000a   K0_BLOCKS=$((K0_SIZE / 0x10000))\u000a\u000a   grep -q '^mtd2: 00f10000 00010000 \"kernel0\"$' /proc/mtd\u000a   grep -q '^mtd3: 00f20000 00010000 \"kernel1\"$' /proc/mtd\u000a   IMG_SIZE=$(wc -c < \"$IMG\")\u000a   [ \"$IMG_SIZE\" -gt 0 ]\u000a   [ \"$IMG_SIZE\" -le $((0x1e30000)) ]\u000a\u000a   dd if=\"$IMG\" of=/dev/mtdblock2 bs=64k count=$K0_BLOCKS conv=fsync\u000a   if [ \"$IMG_SIZE\" -gt \"$K0_SIZE\" ]; then\u000a       dd if=\"$IMG\" of=/dev/mtdblock3 bs=64k skip=$K0_BLOCKS conv=fsync\u000a   else\u000a       dd if=/dev/zero of=/dev/mtdblock3 bs=64k count=1 conv=fsync\u000a   fi\u000a   sync\u000a   reboot\u000a\u000a   The switch comes up in OpenWrt after reboot.\u000a\u000a4. It is recommended to modify the bootcmd to speed up the boot and\u000a   prevent any issues due to the dual-boot selection. Since U-Boot by\u000a   default uses bootubnt which does a lot of (unneeded) RTK\u000a   initialization, quite some time passes until Linux is started.\u000a   Additionally, the U-Boot logic fiddles with some bits on flash which\u000a   causes JFFS2 errors in OpenWrt. While this doesn't seem to cause\u000a   issues yet, be defensive and set the bootcmd from OpenWrt with:\u000a\u000a     fw_setenv bootcmd 'bootm 0xb40b0000'\u000a     fw_printenv bootcmd\u000a\u000a   This directly boots the uImage from flash, without doing all the\u000a   initialization. OpenWrt is able to bootstrap the networking\u000a   completely on its own.\u000a\u000aIt does not matter which bank stock booted from when the dd block\u000aruns: both banks are touched in the same pass (kernel0 written, kernel1\u000aeither written or invalidated). With kernel1 invalidated, U-Boot's\u000ainternal fallback kicks in and permanently switches to kernel0 on the\u000anext boot, so the device stays on OpenWrt as long as kernel0 is\u000abootable.\u000a\u000aRecovery\u000a========\u000a\u000aSince the installation procedure invalidates or partially overwrites\u000athe second bank, recovery requires serial console access (see Hardware\u000aabove for pinout).\u000a\u000a1. Interrupt U-Boot autoboot by spamming a key during early boot to\u000a   drop into the U-Boot prompt.\u000a\u000a2. Bring up networking:\u000a\u000a   rtk network on\u000a\u000a3. Transfer an OpenWrt initramfs image via TFTP and boot it:\u000a\u000a   tftpboot 0x82000000 <server>:<initramfs.bin>\u000a   bootm 0x82000000\u000a\u000a4. From the running initramfs OpenWrt, do a sysupgrade to reflash\u000a   OpenWrt or whatever you want to recover. There is no need for the\u000a   complicated procedure from installation since OpenWrt sees the\u000a   firmware partition already as a whole.\u000a\u000aReturn to stock firmware\u000a========================\u000a\u000aThere is no fully-supported revert path. The stock firmware blob is a\u000aUbiquiti UBNT archive (header + parts, see firmware-utils' fw.h) that\u000aembeds a u-boot and a kernel0 uImage payload; only the latter is\u000arelevant when writing back to the kernel partitions.\u000a\u000aThe snippet below extracts the kernel0 uImage from such a blob by\u000alocating the uImage magic and using the size carried in the uImage\u000aheader itself, without parsing any UBNT framing. It is provided as a\u000abest-effort starting point; verify the result before flashing,\u000aotherwise you're on your own:\u000a\u000a   BLOB=<firmware.bin>\u000a   OFF=$(grep -aboF $'\\x27\\x05\\x19\\x56' \"$BLOB\" | head -1 | cut -d: -f1)\u000a   SIZE=$(( $(dd if=\"$BLOB\" bs=1 skip=$((OFF + 12)) count=4 2>/dev/null \\\u000a               | hexdump -e '1/4 \"%u\"') + 64 ))\u000a   dd if=\"$BLOB\" of=kernel0.uImage bs=1 skip=\"$OFF\" count=\"$SIZE\"\u000a\u000aOnce you have a clean uImage, boot an OpenWrt initramfs as described in\u000aRecovery, copy kernel0.uImage to /tmp, and run:\u000a\u000a   set -e\u000a   [ \"$(wc -c < /tmp/kernel0.uImage)\" -le $((0xf10000)) ] || exit 1\u000a   mtd write /tmp/kernel0.uImage firmware\u000a   fw_setenv bootcmd bootubnt\u000a   fw_printenv bootcmd\u000a   reboot\u000a\u000aAfter rebooting, Ubiquiti's firmware should boot.\u000a\u000aOr, if you made backups of the flash before installation, just write\u000athe backup back to flash.\u000a\u000aLink: https://github.com/openwrt/openwrt/pull/25280\u000aSigned-off-by: Jonas Jelonek <jonas@jonasjelonek.de>\u000a",
        "date" : "2026-09-23 21:15:01 +0200",
        "id" : "98f3808362bec6dc5eee0479be7f4239efbfa91e",
        "msg" : "realtek: add support for Ubiquiti UniFi USW Pro Max 24 PoE",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/base-files/etc/board.d/02_network"
          },
          {
            "editType" : "add",
            "file" : "target/linux/realtek/dts/rtl9302_ubnt_usw-pro-max-24-poe.dts"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/image/rtl930x.mk"
          }
        ]
      }
    ],
    "kind" : "git"
  },
  "culprits" : [
    {
      "absoluteUrl" : "https://taiha.net/jenkins/user/robert.marko",
      "fullName" : "robert.marko"
    },
    {
      "absoluteUrl" : "https://taiha.net/jenkins/user/robimarko",
      "fullName" : "robimarko"
    },
    {
      "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
      "fullName" : "markus.stockhausen"
    },
    {
      "absoluteUrl" : "https://taiha.net/jenkins/user/daniel",
      "fullName" : "daniel"
    },
    {
      "absoluteUrl" : "https://taiha.net/jenkins/user/nbd",
      "fullName" : "nbd"
    },
    {
      "absoluteUrl" : "https://taiha.net/jenkins/user/john",
      "fullName" : "john"
    },
    {
      "absoluteUrl" : "https://taiha.net/jenkins/user/jonas",
      "fullName" : "jonas"
    }
  ]
}