{
  "_class" : "hudson.model.FreeStyleBuild",
  "actions" : [
    {
      "_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" : "WR8750N/WR9500N/WG600HP (AR9344)"
        }
      ]
    },
    {
      "_class" : "hudson.model.CauseAction",
      "causes" : [
        {
          "_class" : "hudson.model.Cause$UserIdCause",
          "shortDescription" : "ユーザーmusashino205が実行",
          "userId" : "tofu",
          "userName" : "musashino205"
        }
      ]
    },
    {
      "_class" : "hudson.plugins.git.util.BuildData",
      "buildsByBranchName" : {
        "refs/remotes/origin/main" : {
          "_class" : "hudson.plugins.git.util.Build",
          "buildNumber" : 502,
          "buildResult" : None,
          "marked" : {
            "SHA1" : "938f67a519de64dcec10759b2b7203aca086f97a",
            "branch" : [
              {
                "SHA1" : "938f67a519de64dcec10759b2b7203aca086f97a",
                "name" : "refs/remotes/origin/main"
              }
            ]
          },
          "revision" : {
            "SHA1" : "938f67a519de64dcec10759b2b7203aca086f97a",
            "branch" : [
              {
                "SHA1" : "938f67a519de64dcec10759b2b7203aca086f97a",
                "name" : "refs/remotes/origin/main"
              }
            ]
          }
        }
      },
      "lastBuiltRevision" : {
        "SHA1" : "938f67a519de64dcec10759b2b7203aca086f97a",
        "branch" : [
          {
            "SHA1" : "938f67a519de64dcec10759b2b7203aca086f97a",
            "name" : "refs/remotes/origin/main"
          }
        ]
      },
      "remoteUrls" : [
        "https://github.com/openwrt/openwrt"
      ],
      "scmName" : ""
    },
    {
      
    },
    {
      
    },
    {
      
    },
    {
      "_class" : "org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction"
    }
  ],
  "artifacts" : [
    
  ],
  "building" : False,
  "description" : "diffconfig: true, device: WR8750N/WR9500N/WG600HP (AR9344)",
  "displayName" : "#502",
  "duration" : 6238,
  "estimatedDuration" : 1655647,
  "executor" : None,
  "fullDisplayName" : "OpenWrt (master) for NEC Aterm (NetBSD based) #502",
  "id" : "502",
  "inProgress" : False,
  "keepLog" : False,
  "number" : 502,
  "queueId" : 67,
  "result" : "FAILURE",
  "timestamp" : 1790936945341,
  "url" : "https://taiha.net/jenkins/view/all/job/OpenWrt-master-NEC-BSD-Aterm/502/",
  "builtOn" : "home-slave02_taihasv",
  "changeSet" : {
    "_class" : "hudson.plugins.git.GitChangeSetList",
    "items" : [
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c"
        ],
        "commitId" : "fa38466dc8f93996262550f28d2ea642220205ca",
        "timestamp" : 1790832511000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: l3: rtl930x: build the whole IPv6 network mask\u000a\u000aotto_l3_930x_net6_mask() writes the leading all-ones bytes and the\u000apartial byte after them, and leaves the rest of the address alone. Both\u000acallers hand it an uninitialised struct, so the partial byte is OR-ed\u000ainto whatever the stack held there and every byte past it keeps that,\u000aand the route is programmed with a mask nobody chose. At a prefix length\u000aof 128 the partial byte is s6_addr[16], one past the end of the address.\u000a\u000aNeither can happen today, because no IPv6 route reaches a writer and the\u000afunction has never run. Fix it before one does.\u000a\u000aAssisted-by: Claude:claude-opus-5\u000aSigned-off-by: Gennaro Cimmino <gcimmino@rayonra.net>\u000aLink: https://github.com/openwrt/openwrt/pull/25507\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-10-01 07:28:31 +0200",
        "id" : "fa38466dc8f93996262550f28d2ea642220205ca",
        "msg" : "realtek: l3: rtl930x: build the whole IPv6 network mask",
        "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/l3.c"
        ],
        "commitId" : "1f802c9c75f5da9b2f8dbf5151c02cf5d34f04ef",
        "timestamp" : 1790832511000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: l3: rtl930x: complete the IPv6 route lookup key\u000a\u000aThe CAM search key of otto_l3_930x_route_lookup_hw() is built from two\u000afields, and the IPv6 side gets both wrong. The entry type belongs in\u000abits 20:19 of L3_HW_LU_KEY_CTRL, which is where the clear mask points,\u000abut the value is written unshifted: the search would run as IPv4 and a\u000astray bit would land in the VID field below. The destination is written\u000aas the top word of the address four times over, so three quarters of an\u000aIPv6 address never reach the key.\u000a\u000aThe field position is the one the GPL SDK gives for ENTRY_TYPE, and the\u000aSDK masks the destination with its prefix before writing the key, which\u000ais what ipv6_addr_prefix() does here. A route with an IPv4 destination\u000ais unaffected: its entry type is zero, so the unshifted write was a\u000ano-op, and its branch is untouched.\u000a\u000aAssisted-by: Claude:claude-opus-5\u000aSigned-off-by: Gennaro Cimmino <gcimmino@rayonra.net>\u000aLink: https://github.com/openwrt/openwrt/pull/25507\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-10-01 07:28:31 +0200",
        "id" : "1f802c9c75f5da9b2f8dbf5151c02cf5d34f04ef",
        "msg" : "realtek: l3: rtl930x: complete the IPv6 route lookup key",
        "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/l3.c"
        ],
        "commitId" : "ace2caa02c9d1d669111ce5cfb1e3e50e91914ff",
        "timestamp" : 1790832511000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: l3: count prefix route rows per address family\u000a\u000aThe hardware answers a prefix lookup with the lowest matching row and\u000athe lookup carries the entry type, so each address family wants its own\u000arun of rows, sorted by prefix length: that is how the vendor SDK lays\u000athe table out, IPv4 from the bottom and IPv6 from the top\u000a(dal_longan_l3.c), and how IPv6 prefix routes are to be placed here.\u000a\u000aThe row bookkeeping cannot express that yet. It counts every placed\u000aprefix route and renumbers every one at or below an insertion point,\u000awithout looking at the family, so inserting into one run would shift\u000arows belonging to the other and leave the list naming rows that no\u000alonger hold those routes.\u000a\u000aNothing changes while every route that gets a row is IPv4 unicast, which\u000ais what the next hop update writes into every route it programs.\u000a\u000aAssisted-by: Claude:claude-opus-5\u000aAssisted-by: Claude:claude-opus-5-5\u000aSigned-off-by: Gennaro Cimmino <gcimmino@rayonra.net>\u000aLink: https://github.com/openwrt/openwrt/pull/25507\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-10-01 07:28:31 +0200",
        "id" : "ace2caa02c9d1d669111ce5cfb1e3e50e91914ff",
        "msg" : "realtek: l3: count prefix route rows per address family",
        "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/l3.h",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c"
        ],
        "commitId" : "655b49fda24cee98a6fafc9443eebc42362676bb",
        "timestamp" : 1790832511000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: l3: key routes on a 16-byte gateway address\u000a\u000aRoutes are grouped by the gateway they use, so that resolving one\u000aneighbour reprograms every route behind it. The key is four bytes wide,\u000awhich is the whole of an IPv4 gateway and a quarter of any other kind,\u000aand the field is read nowhere else: it never reaches a register, and\u000awhat the hardware is given is the next hop MAC the resolution produced.\u000a\u000aWiden it to a full address and store an IPv4 gateway v4-mapped. Within\u000aone family the mapping is injective, so two IPv4 gateways share a key\u000aexactly when they shared one before, including the connected routes that\u000aarrive with no gateway at all and go on sharing a single one; mapping\u000ainstead of zero-extending is also what keeps that shared key distinct\u000afrom the all-zero address a gateway of another family can carry.\u000a\u000aWhat a wider key cannot do is say which family a gateway belongs to. An\u000aIPv4 gateway written v4-mapped is a valid IPv6 gateway, and the kernel\u000aaccepts one on an IPv6 route, so a single key can name two neighbours\u000athat are looked up in different tables and answer with different\u000aaddresses. The routes behind a key are therefore reprogrammed, and a\u000adelete matched, only for the family the event came from.\u000a\u000aThe allocators and the next hop update take the gateway by address\u000arather than by value, so the compiler refuses a bare address of the\u000awrong width where one enters them. The raw lookup in the delete path\u000atakes a void pointer and gets no such help; it is fed the same mapped\u000aaddress its route was keyed on. The one message of the next hop update\u000athat names a gateway to the user reads the IPv4 address back out of the\u000amapped one, so it prints what it printed before.\u000a\u000aAssisted-by: Claude:claude-opus-5\u000aAssisted-by: Claude:claude-opus-5-5\u000aSigned-off-by: Gennaro Cimmino <gcimmino@rayonra.net>\u000aLink: https://github.com/openwrt/openwrt/pull/25507\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-10-01 07:28:31 +0200",
        "id" : "655b49fda24cee98a6fafc9443eebc42362676bb",
        "msg" : "realtek: l3: key routes on a 16-byte gateway address",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.h"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c"
        ],
        "commitId" : "651cde72f10875d16ece30a5704156948880467f",
        "timestamp" : 1790832511000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: l3: keep the address family a route was added with\u000a\u000aProgramming a route once its gateway resolves stamps the entry type of\u000aan IPv4 unicast route over whatever the route was added as, and builds\u000athe destination match of the PIE rule from the IPv4 destination and a\u000amask made by shifting a word by 32 minus the prefix length.\u000a\u000aThe type the add handler set is the one the writers have to see, and a\u000aprefix length that is not an IPv4 one has no such mask. Keep the first\u000aand build the second only for the family it belongs to. The rule fields\u000aare read only where the L3 tables do not carry the destination, and\u000athere every route is IPv4 unicast, which is also why dropping the stamp\u000achanges nothing today.\u000a\u000aAssisted-by: Claude:claude-opus-5\u000aSigned-off-by: Gennaro Cimmino <gcimmino@rayonra.net>\u000aLink: https://github.com/openwrt/openwrt/pull/25507\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-10-01 07:28:31 +0200",
        "id" : "651cde72f10875d16ece30a5704156948880467f",
        "msg" : "realtek: l3: keep the address family a route was added with",
        "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/l3.h",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c"
        ],
        "commitId" : "174b87e3e84e338da9ffafca29ea9dde40c6f3a9",
        "timestamp" : 1790832511000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: l3: tell two gateways of one address apart\u000a\u000aThe routes waiting on a gateway are keyed on the gateway address alone,\u000aso the neighbour that answers writes its MAC into every route that names\u000athat address, whichever link the route leaves by. The neighbour table is\u000akeyed on the device as well as the address, for the reason that one\u000aaddress on two links is two neighbours.\u000a\u000aKeep the device a route reaches its gateway on, and let a neighbour\u000aupdate touch only the routes that were resolved on it. The device is\u000akept as an index and not a pointer: the work item runs long after the\u000aevent and holds no reference to anything.\u000a\u000aA route whose gateway answers on the route's own nexthop device is\u000aunaffected, which is every route whose gateway is reachable the way the\u000akernel was told it is. What changes is the route whose neighbour answers\u000asomewhere else: it took the MAC of whichever neighbour of that address\u000aanswered last, and now it waits for the one on its own device, which is\u000athe neighbour the kernel forwards through. IPv4 gets there through a\u000alink-scope route for the gateway on a second device, through a second\u000arouting table, or through RTNH_F_ONLINK out of a device the gateway is\u000anot on - fib_check_nh_v4_gw() resolves the gateway with the nexthop\u000adevice and table of the route being added, so each of those validates.\u000a\u000aWhich switches run this at all: the RTL839x, whose L3 setup is not\u000abehind the RTL930x offload symbol, and an RTL930x built with that\u000asymbol, which none of the six subtarget configs sets. The RTL838x and\u000aRTL931x have no setup, so their notifiers return on the missing one.\u000a\u000aAssisted-by: Claude:claude-opus-5\u000aAssisted-by: Claude:claude-opus-5-5\u000aSigned-off-by: Gennaro Cimmino <gcimmino@rayonra.net>\u000aLink: https://github.com/openwrt/openwrt/pull/25507\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-10-01 07:28:31 +0200",
        "id" : "174b87e3e84e338da9ffafca29ea9dde40c6f3a9",
        "msg" : "realtek: l3: tell two gateways of one address apart",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.h"
          },
          {
            "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/mirror.h",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl930x.c",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/dsa.c",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl-otto.h",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl838x.c",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl839x.c",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/Makefile",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/mirror.c",
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl931x.c"
        ],
        "commitId" : "82961d51cb1e1cbf64da727d8f9fb82324a4ef26",
        "timestamp" : 1790833244000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: dsa: move port mirroring into dedicated files\u000a\u000aPort mirroring is spread across dsa.c and the four chip-specific files.\u000aConsolidate it in mirror.c to continue organizing the driver by function.\u000a\u000aMove the DSA mirror callbacks and chip-specific configuration helpers into\u000amirror.c. Add mirror.h for their declarations and rtldsa_mirror_config,\u000aand include mirror.o in the driver build.\u000a\u000aKeep the existing operation tables, per-switch state and locking.\u000aNo functional changes intended.\u000a\u000aAssisted-by: ChatGPT (OpenAI GPT-6 Astra)\u000aLink: https://github.com/openwrt/openwrt/pull/25512\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-10-01 07:40:44 +0200",
        "id" : "82961d51cb1e1cbf64da727d8f9fb82324a4ef26",
        "msg" : "realtek: dsa: move port mirroring into dedicated files",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl838x.c"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl839x.c"
          },
          {
            "editType" : "add",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/mirror.h"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl930x.c"
          },
          {
            "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/Makefile"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/dsa.c"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl-otto.h"
          },
          {
            "editType" : "add",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/mirror.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl930x.c"
        ],
        "commitId" : "c1b3943aa367e839030bf1185b44548e6a9f3e74",
        "timestamp" : 1790833244000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: dsa: remove commented-out rtl930x_l3_intf_add\u000a\u000aRemove the unused and incomplete rtl930x_l3_intf_add implementation.\u000aThe function is entirely commented out and has no active callers.\u000a\u000aActive egress interface allocation is handled by otto_l3_alloc_egress_intf\u000ain l3.c, although it does not implement the old dynamic MTU allocation.\u000a\u000aNo functional changes.\u000a\u000aAssisted-by: ChatGPT (OpenAI GPT-6 Astra)\u000aLink: https://github.com/openwrt/openwrt/pull/25512\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-10-01 07:40:44 +0200",
        "id" : "c1b3943aa367e839030bf1185b44548e6a9f3e74",
        "msg" : "realtek: dsa: remove commented-out rtl930x_l3_intf_add",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl930x.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/generic/hack-6.12/970-mux-expose-core-config.patch",
          "target/linux/generic/hack-6.18/970-mux-expose-core-config.patch"
        ],
        "commitId" : "31ef8052449426249b8ea364444df9adab80bfef",
        "timestamp" : 1790855866000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robimarko",
          "fullName" : "robimarko"
        },
        "authorEmail" : "robimarko@gmail.com",
        "comment" : "generic: make multiplexer core config visible\u000a\u000aAll of the mux kmods depend on CONFIG_MULTIPLEXER being set, however its\u000acurrently tristate but with no user visible name so its not selectable by\u000apassing it .config.\u000a\u000aIt can only be selected by other symbols, so when you select for example\u000aGPIO mux kmod in reality nothing is built unless your target already\u000aselects CONFIG_MULTIPLEXER by accident or ALL_KMODS is used.\u000a\u000aSo, as a workaround since it still works fine as tristate, simply add a\u000apatch that makes it visible and thus user selectable.\u000a\u000aSigned-off-by: Robert Marko <robert.marko@sartura.hr>\u000a",
        "date" : "2026-10-01 13:57:46 +0200",
        "id" : "31ef8052449426249b8ea364444df9adab80bfef",
        "msg" : "generic: make multiplexer core config visible",
        "paths" : [
          {
            "editType" : "add",
            "file" : "target/linux/generic/hack-6.18/970-mux-expose-core-config.patch"
          },
          {
            "editType" : "add",
            "file" : "target/linux/generic/hack-6.12/970-mux-expose-core-config.patch"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/net/ethernet/realtek/rtl838x_eth.c"
        ],
        "commitId" : "db61fd4444566302151248926018d1e3fc55521c",
        "timestamp" : 1790876616000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: eth: check TX descriptor availability before padding skb\u000a\u000arteth_start_xmit() pads the skb before checking whether the TX\u000adescriptor is still owned by hardware. If it returns NETDEV_TX_BUSY,\u000athe networking stack retries transmission with the modified skb.\u000aThis can add FCS space repeatedly or prevent detection of a padded\u000aDSA trailer on subsequent attempts.\u000a\u000aMove DSA port detection and padding after the descriptor ownership\u000acheck so that the skb remains unchanged when returning NETDEV_TX_BUSY.\u000a\u000aAssisted-by: ChatGPT (OpenAI GPT-6.1 Sol)\u000aLink: https://github.com/openwrt/openwrt/pull/25519\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-10-01 19:43:36 +0200",
        "id" : "db61fd4444566302151248926018d1e3fc55521c",
        "msg" : "realtek: eth: check TX descriptor availability before padding skb",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/ethernet/realtek/rtl838x_eth.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c"
        ],
        "commitId" : "e59089db5fc9e576d772c61f18610eaeaa331de3",
        "timestamp" : 1790876997000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: l3: skip IPv4 routes without a nexthop device\u000a\u000aA blackhole, unreachable or prohibit route has no device behind its\u000anexthop: fib_create_info() refuses one for these types and skips the\u000anexthop check that would find one, so fib_nh_dev stays NULL.\u000aotto_l3_fib_add_v4() hands that device to is_vlan_dev() before any\u000atest, and otto_l3_fib_check_v4(), which the delete path runs as well,\u000adoes the same in its variable initialisers. On an RTL9303 with the L3\u000aoffload built in, \"ip route add blackhole 10.99.8.0/24\" oopses in the\u000artl83xx work queue and panics the box:\u000a\u000a  CPU 0 Unable to handle kernel paging request at virtual address\u000a  00000000, epc == 8070fe3c, ra == 80710594\u000a  Workqueue: rtl83xx otto_l3_fib_event_work_do\u000a  epc   : 8070fe3c otto_l3_fib_add_v4+0x1c0/0x794\u000a  Kernel panic - not syncing: Fatal exception\u000a\u000aThe faulting load is the priv_flags word is_vlan_dev() tests. Such\u000aroutes are common on a router, for address space it announces but does\u000anot use.\u000a\u000aHandle them where a route through a nexthop object is already handled,\u000afor the same reasons: there is nothing to offload, and the route can\u000astill replace one that was, so the entry for its destination is taken\u000aout, and a host route is trapped where the host table can hold it. The\u000adelete path takes the same exit.\u000a\u000aTested on an RTL9303 (Hasivo S1100W-8XGT-SE) with the L3 offload built\u000ain. Without this change the command above panics the box; with it, a\u000ablackhole /24 stays in the kernel with no entry in hardware, an\u000aoffloaded /24 replaced by a blackhole loses its entry and gets it back\u000awhen replaced through the gateway again, a blackhole /32 gets a trap\u000aentry in the host table, unreachable and prohibit routes go in as\u000awell, and every delete leaves no entry and no oops. RTL839x, which runs\u000athis code in a stock build, was not tested.\u000a\u000aAssisted-by: Claude:claude-opus-5-5\u000aSigned-off-by: Gennaro Cimmino <gcimmino@rayonra.net>\u000aLink: https://github.com/openwrt/openwrt/pull/25513\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-10-01 19:49:57 +0200",
        "id" : "e59089db5fc9e576d772c61f18610eaeaa331de3",
        "msg" : "realtek: l3: skip IPv4 routes without a nexthop device",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "tools/firmware-utils/Makefile"
        ],
        "commitId" : "3746b9b3075209db66bee0800ebbacad7e6ef7b5",
        "timestamp" : 1790879381000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/mail",
          "fullName" : "mail"
        },
        "authorEmail" : "mail@aparcar.org",
        "comment" : "tools: firmware-utils: update to Git HEAD (2026-09-30)\u000a\u000afac587ee67d5 mkzynfw: add board profiles for Zyxel XGS2220 series\u000aa0177f9b3bba mkzynfw: align RTL_OTTO_BOARD definitions\u000aceaf0f9c1e22 mksenaofw: warn instead of erroring on plain type-0 images\u000a71f8d9a9a22a asusuimage: fix fs_offset extraction in show_info\u000a9cf0f6e00e39 zyimage: make output byte order explicit\u000aa1d9589f1ea1 dlink-sge-image: initialize the signature length\u000a\u000aLink: https://github.com/openwrt/openwrt/pull/25517\u000aSigned-off-by: Paul Spooren <mail@aparcar.org>\u000a",
        "date" : "2026-10-01 20:29:41 +0200",
        "id" : "3746b9b3075209db66bee0800ebbacad7e6ef7b5",
        "msg" : "tools: firmware-utils: update to Git HEAD (2026-09-30)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "tools/firmware-utils/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/ap.uc"
        ],
        "commitId" : "4fed8d3c79830a04038f362a47eec3b58beea7a6",
        "timestamp" : 1790879658000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robimarko",
          "fullName" : "robimarko"
        },
        "authorEmail" : "robimarko@gmail.com",
        "comment" : "wifi-scripts: enforce WPA3 for all encryption types on 6 GHz\u000a\u000aThe existing 6 GHz auth_type override only covers mixed modes\u000a(psk-sae, eap-eap2), upgrading them to their WPA3 equivalents.\u000aHowever, if a user configures pure WPA2 (psk or eap) on a 6 GHz\u000aradio, the configuration falls through unchanged and hostapd rejects\u000ait with a confusing error about invalid AKM suite.\u000a\u000aExtend the override to also cover pure WPA2 modes:\u000a  - psk / psk-sae -> sae\u000a  - eap / eap-eap2 -> eap2\u000a\u000aThis matches the existing silent-upgrade pattern and ensures the\u000aradio comes up regardless of which legacy encryption the user\u000aselected.\u000a\u000aSigned-off-by: Michael Pfeifroth <micpf@westermo.com>\u000aLink: https://github.com/openwrt/openwrt/pull/23914\u000aSigned-off-by: Robert Marko <robimarko@gmail.com>\u000a",
        "date" : "2026-10-01 20:34:18 +0200",
        "id" : "4fed8d3c79830a04038f362a47eec3b58beea7a6",
        "msg" : "wifi-scripts: enforce WPA3 for all encryption types on 6 GHz",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/ap.uc"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/network/services/hostapd/src/src/ap/ucode.c"
        ],
        "commitId" : "909be7c9fae643ec5c24f81e2041db468eb52c19",
        "timestamp" : 1790886595000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/nbd",
          "fullName" : "nbd"
        },
        "authorEmail" : "nbd@nbd.name",
        "comment" : "hostapd: build the DPP frame link choice without IEEE 802.11be\u000a\u000ahostapd_dpp_freq_bss() reads hapd->conf->mld_ap, which exists only\u000awith CONFIG_IEEE80211BE, so ucode.c did not build without it. Without\u000ait there is no AP MLD, and the BSS the caller reached answers.\u000a\u000aSigned-off-by: Felix Fietkau <nbd@nbd.name>\u000a",
        "date" : "2026-10-01 22:29:55 +0200",
        "id" : "909be7c9fae643ec5c24f81e2041db468eb52c19",
        "msg" : "hostapd: build the DPP frame link choice without IEEE 802.11be",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/network/services/hostapd/src/src/ap/ucode.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/network/services/ustp/files/ustpd.init"
        ],
        "commitId" : "4850397f5e40d4316d34364fb5b99c4e54d23ec5",
        "timestamp" : 1790886595000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/nbd",
          "fullName" : "nbd"
        },
        "authorEmail" : "nbd@nbd.name",
        "comment" : "ustp: let ustpd write core dumps\u000a\u000aHelps with debugging\u000a\u000aSigned-off-by: Felix Fietkau <nbd@nbd.name>\u000a",
        "date" : "2026-10-01 22:29:55 +0200",
        "id" : "4850397f5e40d4316d34364fb5b99c4e54d23ec5",
        "msg" : "ustp: let ustpd write core dumps",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/network/services/ustp/files/ustpd.init"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/network/services/hostapd/src/src/ap/ubus.c"
        ],
        "commitId" : "c909828ca3f084c0670888ef1119d7857ec3dfaf",
        "timestamp" : 1790886595000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/nbd",
          "fullName" : "nbd"
        },
        "authorEmail" : "nbd@nbd.name",
        "comment" : "hostapd: ubus: count a reference only for a BSS object that was added\u000a\u000ahostapd_ubus_add_bss() counted a reference to the ubus context whether\u000aubus_add_object() succeeded or not, and hostapd_ubus_free_bss() drops\u000aone only for an object with an id. Every BSS whose object could not be\u000aadded, such as each further link of an AP MLD, which all ask for the\u000asame name, kept the context referenced after it was freed. Count the\u000areference only where the object was added.\u000a\u000aSigned-off-by: Felix Fietkau <nbd@nbd.name>\u000a",
        "date" : "2026-10-01 22:29:55 +0200",
        "id" : "c909828ca3f084c0670888ef1119d7857ec3dfaf",
        "msg" : "hostapd: ubus: count a reference only for a BSS object that was added",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/network/services/hostapd/src/src/ap/ubus.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/base-files/files/lib/upgrade/nand.sh"
        ],
        "commitId" : "3f26ab3d4d973fdbd3a1593a68e8186f5cc58dbd",
        "timestamp" : 1790886595000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/nbd",
          "fullName" : "nbd"
        },
        "authorEmail" : "nbd@nbd.name",
        "comment" : "base-files: keep kernel and rootfs UBI volume IDs with provisioning\u000a\u000aSince sysupgrade creates the provisioning volume by default, it takes the\u000alowest free volume ID before the kernel and rootfs volumes are created.\u000aThis shifts their IDs by one, so devices that hardcode the rootfs volume\u000ain root= (e.g. root=/dev/ubiblock0_1) no longer boot after a sysupgrade.\u000a\u000aCreate the provisioning volume with the last volume ID instead.\u000a\u000aA provisioning volume that already exists at a low ID is kept and has to\u000abe removed by hand.\u000a\u000aFixes: 725a1dc534a1 (\"base-files: create the provisioning partition on sysupgrade by default\")\u000aFixes: https://github.com/openwrt/openwrt/issues/25501\u000aSigned-off-by: Johan Alvarado <contact@c127.dev>\u000a",
        "date" : "2026-10-01 22:29:55 +0200",
        "id" : "3f26ab3d4d973fdbd3a1593a68e8186f5cc58dbd",
        "msg" : "base-files: keep kernel and rootfs UBI volume IDs with provisioning",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/base-files/files/lib/upgrade/nand.sh"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/net/ethernet/realtek/rtl838x_eth.c"
        ],
        "commitId" : "eb04f721f5d32595760a66f4830c53af111e180b",
        "timestamp" : 1790919477000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: eth: fix RTL931x L2 MAC register\u000a\u000aThe RTL931x L2 MAC register points to the wrong offset.\u000aFix it.\u000a\u000aFixes: fb6e2568d (\"realtek: eth: refactor rteth_set_mac_hw()\")\u000aAssisted-by: ChatGPT (OpenAI GPT-6.1 Sol)\u000aLink: https://github.com/openwrt/openwrt/pull/25523\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-10-02 07:37:57 +0200",
        "id" : "eb04f721f5d32595760a66f4830c53af111e180b",
        "msg" : "realtek: eth: fix RTL931x L2 MAC register",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/ethernet/realtek/rtl838x_eth.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c"
        ],
        "commitId" : "9b4be03f54c466420d3c375a9f87100a676005a2",
        "timestamp" : 1790919544000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: l3: move the per-route next hop work into a helper\u000a\u000aotto_l3_nexthop_update() programs every route behind a gateway in one\u000aloop body that has grown to a hundred lines. Move that body into\u000aotto_l3_route_update_hw(), which writes one route to the hardware, and\u000aleave the update to find the routes and call it.\u000a\u000aThe body moves as it was. A route it gives up on now returns instead of\u000acontinuing the loop, and the gateway it prints is the route's own, which\u000athe loop has just compared equal to the one it was given. No functional\u000achange.\u000a\u000aAssisted-by: Claude:claude-opus-5-5\u000aSigned-off-by: Gennaro Cimmino <gcimmino@rayonra.net>\u000aLink: https://github.com/openwrt/openwrt/pull/25524\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-10-02 07:39:04 +0200",
        "id" : "9b4be03f54c466420d3c375a9f87100a676005a2",
        "msg" : "realtek: l3: move the per-route next hop work into a helper",
        "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/l3.c"
        ],
        "commitId" : "721ab83af6fd77c0f14685a4312a56fd0c18c3ae",
        "timestamp" : 1790919545000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/markus.stockhausen",
          "fullName" : "markus.stockhausen"
        },
        "authorEmail" : "markus.stockhausen@gmx.de",
        "comment" : "realtek: l3: trap routes whose gateway lost its neighbour\u000a\u000aThe neighbour notifier drops every update that is not NUD_VALID, so once\u000athe kernel has given up on a gateway - its entry failed to resolve, or\u000awas deleted - the routes behind it keep forwarding in hardware to the\u000aaddress it last answered from. The sender is never told the gateway is\u000agone, and the kernel never sees the traffic that would let it notice.\u000a\u000aQueue those updates as well, and turn every route the hardware holds\u000afor that gateway into TRAP2CPU, with the TTL bits clear like a route\u000atrapped for want of a port. The CPU then resolves the gateway again, and\u000athe update that brings a valid neighbour programs the route as before,\u000aor it reports the gateway unreachable. A route never written stays as\u000ait is. mlxsw does the same: it stops offloading a next hop whose\u000aneighbour is not valid, and a route left without one traps.\u000a\u000aAn entry taken out of the table - flushed with its device, or collected\u000awhile stale - is marked dead and can keep a NUD_VALID state, so a dead\u000aneighbour counts as not valid too, as it does for mlxsw. The state, the\u000adead flag and the address are read under the neighbour's lock. On a\u000atable large enough for the periodic collection to run (gc_thresh1, 128\u000aentries by default), the entry of a gateway that only the hardware\u000asends to goes idle and is collected after gc_stale_time; its routes then\u000apass through the CPU until the next packet resolves it again.\u000a\u000aThe RTL839x routes through PIE rules and keeps them as they are, as it\u000adoes for a next hop without a port. Its notifier now queues the invalid\u000aupdates too, which find nothing to write.\u000a\u000aTested on an RTL9303 with a /24 and a /32 through one gateway that stops\u000aanswering ARP until the switch's kernel marks it FAILED. Without this\u000achange both rows stay at forward and the gateway still receives every\u000aecho request; with it both rows trap, none reaches the gateway, and the\u000asender gets Destination Host Unreachable. Once the gateway answers\u000aagain, or after an ip neigh del and the traffic that follows, both rows\u000aare back at forward. With the collection thresholds lowered until the\u000agateway's stale entry is collected, both rows stayed at forward before\u000athe dead flag was tested and trap with it, back at forward with the\u000anext traffic; a down and up of the gateway's interface, which flushes\u000aits neighbours under the table lock, runs clean. The RTL839x was not\u000atested.\u000a\u000aAssisted-by: Claude:claude-opus-5-5\u000aSigned-off-by: Gennaro Cimmino <gcimmino@rayonra.net>\u000aLink: https://github.com/openwrt/openwrt/pull/25524\u000aSigned-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>\u000a",
        "date" : "2026-10-02 07:39:05 +0200",
        "id" : "721ab83af6fd77c0f14685a4312a56fd0c18c3ae",
        "msg" : "realtek: l3: trap routes whose gateway lost its neighbour",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/kirkwood/image/Makefile"
        ],
        "commitId" : "7ca89e074d70bd13091a58a04408c1f7e52b81f4",
        "timestamp" : 1790927533000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/mail",
          "fullName" : "mail"
        },
        "authorEmail" : "mail@aparcar.org",
        "comment" : "kirkwood: store the Ctera firmware members as root\u000a\u000aThe sysupgrade image of the Ctera C200 V1 differs between builds in the\u000auser and group names of the tar members:\u000a\u000a  --rw-r--r-- 0 buildbot  (1000) buildbot  (1000) 175 ... header\u000a  +-rw-r--r-- 0 rebuilder (1000) rebuilder (1000) 175 ... header\u000a\u000actera-firmware sets the mtime of the members, but not their owner, so\u000athe name of the build user ends up in the image. mvebu fixed the same\u000arecipe in commit 0d42a1258f (\"mvebu: improve reproducibility of ctera\u000afirmware\"); store the members as root here too.\u000a\u000aLink: https://github.com/openwrt/openwrt/pull/25525\u000aSigned-off-by: Paul Spooren <mail@aparcar.org>\u000a",
        "date" : "2026-10-02 09:52:13 +0200",
        "id" : "7ca89e074d70bd13091a58a04408c1f7e52b81f4",
        "msg" : "kirkwood: store the Ctera firmware members as root",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/kirkwood/image/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "package/firmware/ipq-wifi/Makefile"
        ],
        "commitId" : "c2eb687d76a04bd66e45fdb2e47998f8f0f565b0",
        "timestamp" : 1790929174000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robimarko",
          "fullName" : "robimarko"
        },
        "authorEmail" : "robimarko@gmail.com",
        "comment" : "ipq-wifi: update to Git HEAD (2026-10-01)\u000a\u000a73091ab6bf52 ci: safely handle changed BDF lists\u000a133ced5d9165 ci: pin BDF workflow dependencies\u000af4123f64c204 ci: cancel superseded BDF workflow runs\u000a5a222aea811f ci: comment BDF details on pull requests\u000ae7026095be09 ci: parse IPQ9574 BDF files\u000a033d9392777e ci: initialize BDF artifact path at runtime\u000a0fd886523d7c ci: parse ipq9574 BDF as ath11k\u000adc51f4c40621 ci: skip BDF comments without an artifact\u000ab8e840138fa9 ci: resolve PRs from workflow-run metadata\u000a9a202b023de2 qcn9274: add TP-Link Archer BE800 BDF\u000add938a6a367f kiwi: update BDF to v5\u000a6a0f508b9ce3 add TP-Link RE700X board files\u000a\u000aSigned-off-by: Robert Marko <robimarko@gmail.com>\u000a",
        "date" : "2026-10-02 10:19:34 +0200",
        "id" : "c2eb687d76a04bd66e45fdb2e47998f8f0f565b0",
        "msg" : "ipq-wifi: update to Git HEAD (2026-10-01)",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "package/firmware/ipq-wifi/Makefile"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/generic/backport-6.18/441-v7.4-spi-spi-qpic-snand-publish-the-ECC-context-to-snandc.patch"
        ],
        "commitId" : "e7eaa9851ff15f7a582132de2f9d05e283fe382f",
        "timestamp" : 1790932170000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robimarko",
          "fullName" : "robimarko"
        },
        "authorEmail" : "robimarko@gmail.com",
        "comment" : "generic: backport spi-qpic-snand stale ECC pointer fix\u000a\u000aqcom_spi_ecc_init_ctx_pipelined() installs the ooblayout but never\u000apublishes the ECC context it allocates, and the cleanup path frees that\u000acontext without clearing snandc->qspi->ecc. The ooblayout callbacks then\u000arun against a stale pointer.\u000a\u000aOn IPQ5018 the qcom,smem-part parser makes the first spi-nand probe\u000adefer, so the retry computes the OOB layout from the freed context and\u000aspinand_init() aborts with -512. About half of the boots on a Mercusys\u000aMR80X ended in \"Waiting for root device /dev/ubiblock0_1\".\u000a\u000aAccepted upstream for v7.4 as f94c9b68bb5f, tagged for stable.\u000a\u000aSigned-off-by: Johan Alvarado <contact@c127.dev>\u000aLink: https://github.com/openwrt/openwrt/pull/24919\u000aSigned-off-by: Robert Marko <robimarko@gmail.com>\u000a",
        "date" : "2026-10-02 11:09:30 +0200",
        "id" : "e7eaa9851ff15f7a582132de2f9d05e283fe382f",
        "msg" : "generic: backport spi-qpic-snand stale ECC pointer fix",
        "paths" : [
          {
            "editType" : "add",
            "file" : "target/linux/generic/backport-6.18/441-v7.4-spi-spi-qpic-snand-publish-the-ECC-context-to-snandc.patch"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "scripts/mercusys-fwup.py"
        ],
        "commitId" : "b5a84a3323584b47f4dd7a7ebf1bae73630a3af0",
        "timestamp" : 1790932170000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robimarko",
          "fullName" : "robimarko"
        },
        "authorEmail" : "robimarko@gmail.com",
        "comment" : "scripts: add Mercusys fwup image generator\u000a\u000aMercusys devices whose stock web UI expects an fwup container reject the\u000atplink-image-2022 container: the loader picks its verification algorithm\u000afrom the fw-type string at offset 0x14, which that container does not\u000awrite.\u000a\u000aBuild the container the loader accepts, with the fw-type string, the\u000asupport list and the MD5 placeholder digest in place.\u000a\u000aThis is a separate script rather than a flag on tplink-mkimage-2022.py\u000abecause only the first 0x14 bytes match, the BE length and the salted MD5\u000aover file[4:]. That script writes 0xff filler up to 0x1014, a table there\u000a(>2I rootfs_size/num_items, then >I32s2I entries), data at a fixed 0x1814\u000abase, the rootfs first and a packed >4B1I2I soft version. The fwup\u000acontainer has no table: 0x2c records of name[32] + >III base, next_off,\u000asize, each followed by its own data and chained through next_off until 0,\u000athe rootfs appended after the last record, and the soft version as ASCII\u000asoft_ver: in an ordinary record.\u000a\u000aSigned-off-by: Johan Alvarado <contact@c127.dev>\u000aLink: https://github.com/openwrt/openwrt/pull/24919\u000aSigned-off-by: Robert Marko <robimarko@gmail.com>\u000a",
        "date" : "2026-10-02 11:09:30 +0200",
        "id" : "b5a84a3323584b47f4dd7a7ebf1bae73630a3af0",
        "msg" : "scripts: add Mercusys fwup image generator",
        "paths" : [
          {
            "editType" : "add",
            "file" : "scripts/mercusys-fwup.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata",
          "target/linux/qualcommax/ipq50xx/base-files/etc/board.d/02_network",
          "target/linux/qualcommax/ipq50xx/base-files/lib/upgrade/platform.sh",
          "target/linux/qualcommax/ipq50xx/base-files/lib/preinit/09_mount_tp_data",
          "target/linux/qualcommax/dts/ipq5018-mr80x-v2.dts",
          "target/linux/qualcommax/ipq50xx/base-files/etc/board.d/01_leds",
          "target/linux/qualcommax/image/ipq50xx.mk",
          "package/boot/uboot-tools/uboot-envtools/files/qualcommax_ipq50xx"
        ],
        "commitId" : "938f67a519de64dcec10759b2b7203aca086f97a",
        "timestamp" : 1790932170000,
        "author" : {
          "absoluteUrl" : "https://taiha.net/jenkins/user/robimarko",
          "fullName" : "robimarko"
        },
        "authorEmail" : "robimarko@gmail.com",
        "comment" : "qualcommax: add support for Mercusys MR80X v2\u000a\u000aHardware:\u000a  SoC:    Qualcomm IPQ5018 (2x Cortex-A53)\u000a  RAM:    256 MiB DDR3\u000a  Flash:  128 MiB SPI-NAND (ESMT)\u000a  Switch: Realtek RTL8367S, 4x GbE (3x LAN + 1x WAN), SGMII CPU port\u000a  WiFi:   IPQ5018 2.4 GHz, QCN6122 5 GHz, both 802.11ax\u000a  LEDs:   system (green/amber), WAN, LAN1-3\u000a  Button: reset\u000a  UART:   115200 8N1, 3.3V, on-board header\u000a\u000aWi-Fi is left disabled: 256 MiB is too few for ath11k, same as on the\u000aELECOM WRC-X3000GS2.\u000a\u000aNotes:\u000a- The label reads \"Ver 2.20\", but the vendor firmware only ever calls the\u000a  board V2: the GPL tree is GPL_MR80Xv2, PRODUCT_NAME is MR80Xv2, the\u000a  running system reports \"MR80X V2\" and the fwup support list carries\u000a  product_ver 2.0.0. The trailing digits are a production sub-revision,\u000a  so the port is named v2.\u000a- MAC1 runs sgmii through the UNIPHY PCS to RTL8367S port 6. The link is\u000a  wired for HSGMII and 2500base-x does come up, but only when gmac1 and\u000a  the CPU port carry the same phy-mode: the UNIPHY PCS belongs to the\u000a  conduit (pcs-handle = <&uniphy0> in ipq5018-ess.dtsi), so setting the\u000a  CPU port alone leaves the switch running HSGMII into a SerDes still\u000a  clocked for SGMII.\u000a  With both ends at 2500base-x the trunk still dies on some boots: over\u000a  12 reboots, 2 came up with the CPU port passing no traffic at all -\u000a  eth0 transmitting while s00_p06_ifInOctets stayed at 0, no FCS errors,\u000a  the link reporting 2.5 Gbps. That matches the bring-up ordering race\u000a  described in openwrt/openwrt#25153, where the switch end of the trunk\u000a  is configured before the IPQ5018 UNIPHY resets and recalibrates its\u000a  PLL. sgmii has not reproduced it, so the port ships at sgmii until\u000a  that fix lands.\u000a- MAC addresses come from default-mac in the vendor tp_data UBI volume,\u000a  6 raw bytes at offset 0, mounted read-only during preinit:\u000a    label   default-mac\u000a    LAN     default-mac\u000a    WAN     default-mac + 1\u000a    2.4 GHz default-mac - 1\u000a    5 GHz   default-mac - 2\u000a- Sysupgrade A/B ping-pongs rootfs/rootfs_1 via tp_boot_idx, switched\u000a  only after the new slot is fully written. primaryboot stays 0, the\u000a  stock loader and the button recovery rely on it.\u000a- factory.bin is wrapped in the Mercusys fwup container the stock web UI\u000a  accepts (scripts/mercusys-fwup.py). The generic tplink-image-2022\u000a  container is rejected: the loader picks its verification algorithm from\u000a  the fw-type string, which that container does not write.\u000a- The board needs the backported spi-qpic-snand ECC context fix,\u000a  otherwise about half of the boots end in \"Waiting for root device\u000a  /dev/ubiblock0_1\".\u000a\u000aInstallation:\u000a  In the stock web UI go to Advanced -> System -> Firmware Update ->\u000a  Local Update, browse for\u000a  openwrt-qualcommax-ipq50xx-mercusys_mr80x-v2-squashfs-factory.bin\u000a  and press UPDATE.\u000a\u000a  Tested on stock firmware MR80X(EU)_V2.20_1.1.7 Build 20250415\u000a  (Multi-language).\u000a\u000a  The U-Boot web recovery does not accept this image: it verifies an\u000a  RSA1024 signature and has no keyless path. Use the stock web UI.\u000a\u000aSigned-off-by: Johan Alvarado <contact@c127.dev>\u000aLink: https://github.com/openwrt/openwrt/pull/24919\u000aSigned-off-by: Robert Marko <robimarko@gmail.com>\u000a",
        "date" : "2026-10-02 11:09:30 +0200",
        "id" : "938f67a519de64dcec10759b2b7203aca086f97a",
        "msg" : "qualcommax: add support for Mercusys MR80X v2",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "target/linux/qualcommax/image/ipq50xx.mk"
          },
          {
            "editType" : "edit",
            "file" : "package/boot/uboot-tools/uboot-envtools/files/qualcommax_ipq50xx"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/qualcommax/ipq50xx/base-files/lib/upgrade/platform.sh"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/qualcommax/ipq50xx/base-files/etc/board.d/02_network"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/qualcommax/ipq50xx/base-files/lib/preinit/09_mount_tp_data"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata"
          },
          {
            "editType" : "add",
            "file" : "target/linux/qualcommax/dts/ipq5018-mr80x-v2.dts"
          },
          {
            "editType" : "edit",
            "file" : "target/linux/qualcommax/ipq50xx/base-files/etc/board.d/01_leds"
          }
        ]
      }
    ],
    "kind" : "git"
  },
  "culprits" : [
    {
      "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/mail",
      "fullName" : "mail"
    },
    {
      "absoluteUrl" : "https://taiha.net/jenkins/user/hauke",
      "fullName" : "hauke"
    },
    {
      "absoluteUrl" : "https://taiha.net/jenkins/user/jonas",
      "fullName" : "jonas"
    },
    {
      "absoluteUrl" : "https://taiha.net/jenkins/user/ansuelsmth",
      "fullName" : "ansuelsmth"
    },
    {
      "absoluteUrl" : "https://taiha.net/jenkins/user/nbd",
      "fullName" : "nbd"
    },
    {
      "absoluteUrl" : "https://taiha.net/jenkins/user/lynxis",
      "fullName" : "lynxis"
    }
  ]
}