<freeStyleBuild _class='hudson.model.FreeStyleBuild'><action _class='hudson.model.ParametersAction'><parameter _class='hudson.model.BooleanParameterValue'><name>BUILD_CFG_DISTCLEAN</name><value>true</value></parameter><parameter _class='hudson.model.BooleanParameterValue'><name>BUILD_CFG_DIFFCONFIG</name><value>true</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>BUILD_CFG_TARGET_DEV</name><value>WR8750N/WR9500N/WG600HP (AR9344)</value></parameter></action><action _class='hudson.model.CauseAction'><cause _class='hudson.model.Cause$UserIdCause'><shortDescription>ユーザーmusashino205が実行</shortDescription><userId>tofu</userId><userName>musashino205</userName></cause></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmain _class='hudson.plugins.git.util.Build'><buildNumber>502</buildNumber><marked><SHA1>938f67a519de64dcec10759b2b7203aca086f97a</SHA1><branch><SHA1>938f67a519de64dcec10759b2b7203aca086f97a</SHA1><name>refs/remotes/origin/main</name></branch></marked><revision><SHA1>938f67a519de64dcec10759b2b7203aca086f97a</SHA1><branch><SHA1>938f67a519de64dcec10759b2b7203aca086f97a</SHA1><name>refs/remotes/origin/main</name></branch></revision></refsremotesoriginmain></buildsByBranchName><lastBuiltRevision><SHA1>938f67a519de64dcec10759b2b7203aca086f97a</SHA1><branch><SHA1>938f67a519de64dcec10759b2b7203aca086f97a</SHA1><name>refs/remotes/origin/main</name></branch></lastBuiltRevision><remoteUrl>https://github.com/openwrt/openwrt</remoteUrl><scmName></scmName></action><action></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'><artifactsUrl>https://taiha.net/jenkins/view/all/job/OpenWrt-master-NEC-BSD-Aterm/lastFailedBuild/artifact</artifactsUrl><changesUrl>https://taiha.net/jenkins/view/all/job/OpenWrt-master-NEC-BSD-Aterm/changes</changesUrl><displayUrl>https://taiha.net/jenkins/view/all/job/OpenWrt-master-NEC-BSD-Aterm/lastFailedBuild/</displayUrl><testsUrl>https://taiha.net/jenkins/view/all/job/OpenWrt-master-NEC-BSD-Aterm/lastFailedBuild/testReport</testsUrl></action><building>false</building><description>diffconfig: true, device: WR8750N/WR9500N/WG600HP (AR9344)</description><displayName>#502</displayName><duration>6238</duration><estimatedDuration>1655647</estimatedDuration><fullDisplayName>OpenWrt (master) for NEC Aterm (NetBSD based) #502</fullDisplayName><id>502</id><inProgress>false</inProgress><keepLog>false</keepLog><number>502</number><queueId>67</queueId><result>FAILURE</result><timestamp>1790936945341</timestamp><url>https://taiha.net/jenkins/view/all/job/OpenWrt-master-NEC-BSD-Aterm/502/</url><builtOn>home-slave02_taihasv</builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c</affectedPath><commitId>fa38466dc8f93996262550f28d2ea642220205ca</commitId><timestamp>1790832511000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: l3: rtl930x: build the whole IPv6 network mask

otto_l3_930x_net6_mask() writes the leading all-ones bytes and the
partial byte after them, and leaves the rest of the address alone. Both
callers hand it an uninitialised struct, so the partial byte is OR-ed
into whatever the stack held there and every byte past it keeps that,
and the route is programmed with a mask nobody chose. At a prefix length
of 128 the partial byte is s6_addr[16], one past the end of the address.

Neither can happen today, because no IPv6 route reaches a writer and the
function has never run. Fix it before one does.

Assisted-by: Claude:claude-opus-5
Signed-off-by: Gennaro Cimmino &lt;gcimmino@rayonra.net&gt;
Link: https://github.com/openwrt/openwrt/pull/25507
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-10-01 07:28:31 +0200</date><id>fa38466dc8f93996262550f28d2ea642220205ca</id><msg>realtek: l3: rtl930x: build the whole IPv6 network mask</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c</affectedPath><commitId>1f802c9c75f5da9b2f8dbf5151c02cf5d34f04ef</commitId><timestamp>1790832511000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: l3: rtl930x: complete the IPv6 route lookup key

The CAM search key of otto_l3_930x_route_lookup_hw() is built from two
fields, and the IPv6 side gets both wrong. The entry type belongs in
bits 20:19 of L3_HW_LU_KEY_CTRL, which is where the clear mask points,
but the value is written unshifted: the search would run as IPv4 and a
stray bit would land in the VID field below. The destination is written
as the top word of the address four times over, so three quarters of an
IPv6 address never reach the key.

The field position is the one the GPL SDK gives for ENTRY_TYPE, and the
SDK masks the destination with its prefix before writing the key, which
is what ipv6_addr_prefix() does here. A route with an IPv4 destination
is unaffected: its entry type is zero, so the unshifted write was a
no-op, and its branch is untouched.

Assisted-by: Claude:claude-opus-5
Signed-off-by: Gennaro Cimmino &lt;gcimmino@rayonra.net&gt;
Link: https://github.com/openwrt/openwrt/pull/25507
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-10-01 07:28:31 +0200</date><id>1f802c9c75f5da9b2f8dbf5151c02cf5d34f04ef</id><msg>realtek: l3: rtl930x: complete the IPv6 route lookup key</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c</affectedPath><commitId>ace2caa02c9d1d669111ce5cfb1e3e50e91914ff</commitId><timestamp>1790832511000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: l3: count prefix route rows per address family

The hardware answers a prefix lookup with the lowest matching row and
the lookup carries the entry type, so each address family wants its own
run of rows, sorted by prefix length: that is how the vendor SDK lays
the table out, IPv4 from the bottom and IPv6 from the top
(dal_longan_l3.c), and how IPv6 prefix routes are to be placed here.

The row bookkeeping cannot express that yet. It counts every placed
prefix route and renumbers every one at or below an insertion point,
without looking at the family, so inserting into one run would shift
rows belonging to the other and leave the list naming rows that no
longer hold those routes.

Nothing changes while every route that gets a row is IPv4 unicast, which
is what the next hop update writes into every route it programs.

Assisted-by: Claude:claude-opus-5
Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Gennaro Cimmino &lt;gcimmino@rayonra.net&gt;
Link: https://github.com/openwrt/openwrt/pull/25507
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-10-01 07:28:31 +0200</date><id>ace2caa02c9d1d669111ce5cfb1e3e50e91914ff</id><msg>realtek: l3: count prefix route rows per address family</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.h</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c</affectedPath><commitId>655b49fda24cee98a6fafc9443eebc42362676bb</commitId><timestamp>1790832511000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: l3: key routes on a 16-byte gateway address

Routes are grouped by the gateway they use, so that resolving one
neighbour reprograms every route behind it. The key is four bytes wide,
which is the whole of an IPv4 gateway and a quarter of any other kind,
and the field is read nowhere else: it never reaches a register, and
what the hardware is given is the next hop MAC the resolution produced.

Widen it to a full address and store an IPv4 gateway v4-mapped. Within
one family the mapping is injective, so two IPv4 gateways share a key
exactly when they shared one before, including the connected routes that
arrive with no gateway at all and go on sharing a single one; mapping
instead of zero-extending is also what keeps that shared key distinct
from the all-zero address a gateway of another family can carry.

What a wider key cannot do is say which family a gateway belongs to. An
IPv4 gateway written v4-mapped is a valid IPv6 gateway, and the kernel
accepts one on an IPv6 route, so a single key can name two neighbours
that are looked up in different tables and answer with different
addresses. The routes behind a key are therefore reprogrammed, and a
delete matched, only for the family the event came from.

The allocators and the next hop update take the gateway by address
rather than by value, so the compiler refuses a bare address of the
wrong width where one enters them. The raw lookup in the delete path
takes a void pointer and gets no such help; it is fed the same mapped
address its route was keyed on. The one message of the next hop update
that names a gateway to the user reads the IPv4 address back out of the
mapped one, so it prints what it printed before.

Assisted-by: Claude:claude-opus-5
Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Gennaro Cimmino &lt;gcimmino@rayonra.net&gt;
Link: https://github.com/openwrt/openwrt/pull/25507
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-10-01 07:28:31 +0200</date><id>655b49fda24cee98a6fafc9443eebc42362676bb</id><msg>realtek: l3: key routes on a 16-byte gateway address</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c</file></path><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.h</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c</affectedPath><commitId>651cde72f10875d16ece30a5704156948880467f</commitId><timestamp>1790832511000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: l3: keep the address family a route was added with

Programming a route once its gateway resolves stamps the entry type of
an IPv4 unicast route over whatever the route was added as, and builds
the destination match of the PIE rule from the IPv4 destination and a
mask made by shifting a word by 32 minus the prefix length.

The type the add handler set is the one the writers have to see, and a
prefix length that is not an IPv4 one has no such mask. Keep the first
and build the second only for the family it belongs to. The rule fields
are read only where the L3 tables do not carry the destination, and
there every route is IPv4 unicast, which is also why dropping the stamp
changes nothing today.

Assisted-by: Claude:claude-opus-5
Signed-off-by: Gennaro Cimmino &lt;gcimmino@rayonra.net&gt;
Link: https://github.com/openwrt/openwrt/pull/25507
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-10-01 07:28:31 +0200</date><id>651cde72f10875d16ece30a5704156948880467f</id><msg>realtek: l3: keep the address family a route was added with</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.h</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c</affectedPath><commitId>174b87e3e84e338da9ffafca29ea9dde40c6f3a9</commitId><timestamp>1790832511000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: l3: tell two gateways of one address apart

The routes waiting on a gateway are keyed on the gateway address alone,
so the neighbour that answers writes its MAC into every route that names
that address, whichever link the route leaves by. The neighbour table is
keyed on the device as well as the address, for the reason that one
address on two links is two neighbours.

Keep the device a route reaches its gateway on, and let a neighbour
update touch only the routes that were resolved on it. The device is
kept as an index and not a pointer: the work item runs long after the
event and holds no reference to anything.

A route whose gateway answers on the route's own nexthop device is
unaffected, which is every route whose gateway is reachable the way the
kernel was told it is. What changes is the route whose neighbour answers
somewhere else: it took the MAC of whichever neighbour of that address
answered last, and now it waits for the one on its own device, which is
the neighbour the kernel forwards through. IPv4 gets there through a
link-scope route for the gateway on a second device, through a second
routing table, or through RTNH_F_ONLINK out of a device the gateway is
not on - fib_check_nh_v4_gw() resolves the gateway with the nexthop
device and table of the route being added, so each of those validates.

Which switches run this at all: the RTL839x, whose L3 setup is not
behind the RTL930x offload symbol, and an RTL930x built with that
symbol, which none of the six subtarget configs sets. The RTL838x and
RTL931x have no setup, so their notifiers return on the missing one.

Assisted-by: Claude:claude-opus-5
Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Gennaro Cimmino &lt;gcimmino@rayonra.net&gt;
Link: https://github.com/openwrt/openwrt/pull/25507
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-10-01 07:28:31 +0200</date><id>174b87e3e84e338da9ffafca29ea9dde40c6f3a9</id><msg>realtek: l3: tell two gateways of one address apart</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c</file></path><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.h</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/mirror.h</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl-otto.h</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl930x.c</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/dsa.c</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl838x.c</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl839x.c</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/Makefile</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/mirror.c</affectedPath><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl931x.c</affectedPath><commitId>82961d51cb1e1cbf64da727d8f9fb82324a4ef26</commitId><timestamp>1790833244000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: dsa: move port mirroring into dedicated files

Port mirroring is spread across dsa.c and the four chip-specific files.
Consolidate it in mirror.c to continue organizing the driver by function.

Move the DSA mirror callbacks and chip-specific configuration helpers into
mirror.c. Add mirror.h for their declarations and rtldsa_mirror_config,
and include mirror.o in the driver build.

Keep the existing operation tables, per-switch state and locking.
No functional changes intended.

Assisted-by: ChatGPT (OpenAI GPT-6 Astra)
Link: https://github.com/openwrt/openwrt/pull/25512
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-10-01 07:40:44 +0200</date><id>82961d51cb1e1cbf64da727d8f9fb82324a4ef26</id><msg>realtek: dsa: move port mirroring into dedicated files</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl838x.c</file></path><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl-otto.h</file></path><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl839x.c</file></path><path><editType>add</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/mirror.c</file></path><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl930x.c</file></path><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/Makefile</file></path><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl931x.c</file></path><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/dsa.c</file></path><path><editType>add</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/mirror.h</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl930x.c</affectedPath><commitId>c1b3943aa367e839030bf1185b44548e6a9f3e74</commitId><timestamp>1790833244000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: dsa: remove commented-out rtl930x_l3_intf_add

Remove the unused and incomplete rtl930x_l3_intf_add implementation.
The function is entirely commented out and has no active callers.

Active egress interface allocation is handled by otto_l3_alloc_egress_intf
in l3.c, although it does not implement the old dynamic MTU allocation.

No functional changes.

Assisted-by: ChatGPT (OpenAI GPT-6 Astra)
Link: https://github.com/openwrt/openwrt/pull/25512
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-10-01 07:40:44 +0200</date><id>c1b3943aa367e839030bf1185b44548e6a9f3e74</id><msg>realtek: dsa: remove commented-out rtl930x_l3_intf_add</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl930x.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/generic/hack-6.12/970-mux-expose-core-config.patch</affectedPath><affectedPath>target/linux/generic/hack-6.18/970-mux-expose-core-config.patch</affectedPath><commitId>31ef8052449426249b8ea364444df9adab80bfef</commitId><timestamp>1790855866000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName></author><authorEmail>robimarko@gmail.com</authorEmail><comment>generic: make multiplexer core config visible

All of the mux kmods depend on CONFIG_MULTIPLEXER being set, however its
currently tristate but with no user visible name so its not selectable by
passing it .config.

It can only be selected by other symbols, so when you select for example
GPIO mux kmod in reality nothing is built unless your target already
selects CONFIG_MULTIPLEXER by accident or ALL_KMODS is used.

So, as a workaround since it still works fine as tristate, simply add a
patch that makes it visible and thus user selectable.

Signed-off-by: Robert Marko &lt;robert.marko@sartura.hr&gt;
</comment><date>2026-10-01 13:57:46 +0200</date><id>31ef8052449426249b8ea364444df9adab80bfef</id><msg>generic: make multiplexer core config visible</msg><path><editType>add</editType><file>target/linux/generic/hack-6.12/970-mux-expose-core-config.patch</file></path><path><editType>add</editType><file>target/linux/generic/hack-6.18/970-mux-expose-core-config.patch</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/ethernet/realtek/rtl838x_eth.c</affectedPath><commitId>db61fd4444566302151248926018d1e3fc55521c</commitId><timestamp>1790876616000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: eth: check TX descriptor availability before padding skb

rteth_start_xmit() pads the skb before checking whether the TX
descriptor is still owned by hardware. If it returns NETDEV_TX_BUSY,
the networking stack retries transmission with the modified skb.
This can add FCS space repeatedly or prevent detection of a padded
DSA trailer on subsequent attempts.

Move DSA port detection and padding after the descriptor ownership
check so that the skb remains unchanged when returning NETDEV_TX_BUSY.

Assisted-by: ChatGPT (OpenAI GPT-6.1 Sol)
Link: https://github.com/openwrt/openwrt/pull/25519
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-10-01 19:43:36 +0200</date><id>db61fd4444566302151248926018d1e3fc55521c</id><msg>realtek: eth: check TX descriptor availability before padding skb</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/ethernet/realtek/rtl838x_eth.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c</affectedPath><commitId>e59089db5fc9e576d772c61f18610eaeaa331de3</commitId><timestamp>1790876997000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: l3: skip IPv4 routes without a nexthop device

A blackhole, unreachable or prohibit route has no device behind its
nexthop: fib_create_info() refuses one for these types and skips the
nexthop check that would find one, so fib_nh_dev stays NULL.
otto_l3_fib_add_v4() hands that device to is_vlan_dev() before any
test, and otto_l3_fib_check_v4(), which the delete path runs as well,
does the same in its variable initialisers. On an RTL9303 with the L3
offload built in, "ip route add blackhole 10.99.8.0/24" oopses in the
rtl83xx work queue and panics the box:

  CPU 0 Unable to handle kernel paging request at virtual address
  00000000, epc == 8070fe3c, ra == 80710594
  Workqueue: rtl83xx otto_l3_fib_event_work_do
  epc   : 8070fe3c otto_l3_fib_add_v4+0x1c0/0x794
  Kernel panic - not syncing: Fatal exception

The faulting load is the priv_flags word is_vlan_dev() tests. Such
routes are common on a router, for address space it announces but does
not use.

Handle them where a route through a nexthop object is already handled,
for the same reasons: there is nothing to offload, and the route can
still replace one that was, so the entry for its destination is taken
out, and a host route is trapped where the host table can hold it. The
delete path takes the same exit.

Tested on an RTL9303 (Hasivo S1100W-8XGT-SE) with the L3 offload built
in. Without this change the command above panics the box; with it, a
blackhole /24 stays in the kernel with no entry in hardware, an
offloaded /24 replaced by a blackhole loses its entry and gets it back
when replaced through the gateway again, a blackhole /32 gets a trap
entry in the host table, unreachable and prohibit routes go in as
well, and every delete leaves no entry and no oops. RTL839x, which runs
this code in a stock build, was not tested.

Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Gennaro Cimmino &lt;gcimmino@rayonra.net&gt;
Link: https://github.com/openwrt/openwrt/pull/25513
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-10-01 19:49:57 +0200</date><id>e59089db5fc9e576d772c61f18610eaeaa331de3</id><msg>realtek: l3: skip IPv4 routes without a nexthop device</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tools/firmware-utils/Makefile</affectedPath><commitId>3746b9b3075209db66bee0800ebbacad7e6ef7b5</commitId><timestamp>1790879381000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/mail</absoluteUrl><fullName>mail</fullName></author><authorEmail>mail@aparcar.org</authorEmail><comment>tools: firmware-utils: update to Git HEAD (2026-09-30)

fac587ee67d5 mkzynfw: add board profiles for Zyxel XGS2220 series
a0177f9b3bba mkzynfw: align RTL_OTTO_BOARD definitions
ceaf0f9c1e22 mksenaofw: warn instead of erroring on plain type-0 images
71f8d9a9a22a asusuimage: fix fs_offset extraction in show_info
9cf0f6e00e39 zyimage: make output byte order explicit
a1d9589f1ea1 dlink-sge-image: initialize the signature length

Link: https://github.com/openwrt/openwrt/pull/25517
Signed-off-by: Paul Spooren &lt;mail@aparcar.org&gt;
</comment><date>2026-10-01 20:29:41 +0200</date><id>3746b9b3075209db66bee0800ebbacad7e6ef7b5</id><msg>tools: firmware-utils: update to Git HEAD (2026-09-30)</msg><path><editType>edit</editType><file>tools/firmware-utils/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/ap.uc</affectedPath><commitId>4fed8d3c79830a04038f362a47eec3b58beea7a6</commitId><timestamp>1790879658000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName></author><authorEmail>robimarko@gmail.com</authorEmail><comment>wifi-scripts: enforce WPA3 for all encryption types on 6 GHz

The existing 6 GHz auth_type override only covers mixed modes
(psk-sae, eap-eap2), upgrading them to their WPA3 equivalents.
However, if a user configures pure WPA2 (psk or eap) on a 6 GHz
radio, the configuration falls through unchanged and hostapd rejects
it with a confusing error about invalid AKM suite.

Extend the override to also cover pure WPA2 modes:
  - psk / psk-sae -&gt; sae
  - eap / eap-eap2 -&gt; eap2

This matches the existing silent-upgrade pattern and ensures the
radio comes up regardless of which legacy encryption the user
selected.

Signed-off-by: Michael Pfeifroth &lt;micpf@westermo.com&gt;
Link: https://github.com/openwrt/openwrt/pull/23914
Signed-off-by: Robert Marko &lt;robimarko@gmail.com&gt;
</comment><date>2026-10-01 20:34:18 +0200</date><id>4fed8d3c79830a04038f362a47eec3b58beea7a6</id><msg>wifi-scripts: enforce WPA3 for all encryption types on 6 GHz</msg><path><editType>edit</editType><file>package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/ap.uc</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/network/services/hostapd/src/src/ap/ucode.c</affectedPath><commitId>909be7c9fae643ec5c24f81e2041db468eb52c19</commitId><timestamp>1790886595000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/nbd</absoluteUrl><fullName>nbd</fullName></author><authorEmail>nbd@nbd.name</authorEmail><comment>hostapd: build the DPP frame link choice without IEEE 802.11be

hostapd_dpp_freq_bss() reads hapd-&gt;conf-&gt;mld_ap, which exists only
with CONFIG_IEEE80211BE, so ucode.c did not build without it. Without
it there is no AP MLD, and the BSS the caller reached answers.

Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</comment><date>2026-10-01 22:29:55 +0200</date><id>909be7c9fae643ec5c24f81e2041db468eb52c19</id><msg>hostapd: build the DPP frame link choice without IEEE 802.11be</msg><path><editType>edit</editType><file>package/network/services/hostapd/src/src/ap/ucode.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/network/services/ustp/files/ustpd.init</affectedPath><commitId>4850397f5e40d4316d34364fb5b99c4e54d23ec5</commitId><timestamp>1790886595000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/nbd</absoluteUrl><fullName>nbd</fullName></author><authorEmail>nbd@nbd.name</authorEmail><comment>ustp: let ustpd write core dumps

Helps with debugging

Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</comment><date>2026-10-01 22:29:55 +0200</date><id>4850397f5e40d4316d34364fb5b99c4e54d23ec5</id><msg>ustp: let ustpd write core dumps</msg><path><editType>edit</editType><file>package/network/services/ustp/files/ustpd.init</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/network/services/hostapd/src/src/ap/ubus.c</affectedPath><commitId>c909828ca3f084c0670888ef1119d7857ec3dfaf</commitId><timestamp>1790886595000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/nbd</absoluteUrl><fullName>nbd</fullName></author><authorEmail>nbd@nbd.name</authorEmail><comment>hostapd: ubus: count a reference only for a BSS object that was added

hostapd_ubus_add_bss() counted a reference to the ubus context whether
ubus_add_object() succeeded or not, and hostapd_ubus_free_bss() drops
one only for an object with an id. Every BSS whose object could not be
added, such as each further link of an AP MLD, which all ask for the
same name, kept the context referenced after it was freed. Count the
reference only where the object was added.

Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</comment><date>2026-10-01 22:29:55 +0200</date><id>c909828ca3f084c0670888ef1119d7857ec3dfaf</id><msg>hostapd: ubus: count a reference only for a BSS object that was added</msg><path><editType>edit</editType><file>package/network/services/hostapd/src/src/ap/ubus.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/base-files/files/lib/upgrade/nand.sh</affectedPath><commitId>3f26ab3d4d973fdbd3a1593a68e8186f5cc58dbd</commitId><timestamp>1790886595000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/nbd</absoluteUrl><fullName>nbd</fullName></author><authorEmail>nbd@nbd.name</authorEmail><comment>base-files: keep kernel and rootfs UBI volume IDs with provisioning

Since sysupgrade creates the provisioning volume by default, it takes the
lowest free volume ID before the kernel and rootfs volumes are created.
This shifts their IDs by one, so devices that hardcode the rootfs volume
in root= (e.g. root=/dev/ubiblock0_1) no longer boot after a sysupgrade.

Create the provisioning volume with the last volume ID instead.

A provisioning volume that already exists at a low ID is kept and has to
be removed by hand.

Fixes: 725a1dc534a1 ("base-files: create the provisioning partition on sysupgrade by default")
Fixes: https://github.com/openwrt/openwrt/issues/25501
Signed-off-by: Johan Alvarado &lt;contact@c127.dev&gt;
</comment><date>2026-10-01 22:29:55 +0200</date><id>3f26ab3d4d973fdbd3a1593a68e8186f5cc58dbd</id><msg>base-files: keep kernel and rootfs UBI volume IDs with provisioning</msg><path><editType>edit</editType><file>package/base-files/files/lib/upgrade/nand.sh</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/ethernet/realtek/rtl838x_eth.c</affectedPath><commitId>eb04f721f5d32595760a66f4830c53af111e180b</commitId><timestamp>1790919477000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: eth: fix RTL931x L2 MAC register

The RTL931x L2 MAC register points to the wrong offset.
Fix it.

Fixes: fb6e2568d ("realtek: eth: refactor rteth_set_mac_hw()")
Assisted-by: ChatGPT (OpenAI GPT-6.1 Sol)
Link: https://github.com/openwrt/openwrt/pull/25523
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-10-02 07:37:57 +0200</date><id>eb04f721f5d32595760a66f4830c53af111e180b</id><msg>realtek: eth: fix RTL931x L2 MAC register</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/ethernet/realtek/rtl838x_eth.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c</affectedPath><commitId>9b4be03f54c466420d3c375a9f87100a676005a2</commitId><timestamp>1790919544000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: l3: move the per-route next hop work into a helper

otto_l3_nexthop_update() programs every route behind a gateway in one
loop body that has grown to a hundred lines. Move that body into
otto_l3_route_update_hw(), which writes one route to the hardware, and
leave the update to find the routes and call it.

The body moves as it was. A route it gives up on now returns instead of
continuing the loop, and the gateway it prints is the route's own, which
the loop has just compared equal to the one it was given. No functional
change.

Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Gennaro Cimmino &lt;gcimmino@rayonra.net&gt;
Link: https://github.com/openwrt/openwrt/pull/25524
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-10-02 07:39:04 +0200</date><id>9b4be03f54c466420d3c375a9f87100a676005a2</id><msg>realtek: l3: move the per-route next hop work into a helper</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c</affectedPath><commitId>721ab83af6fd77c0f14685a4312a56fd0c18c3ae</commitId><timestamp>1790919545000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName></author><authorEmail>markus.stockhausen@gmx.de</authorEmail><comment>realtek: l3: trap routes whose gateway lost its neighbour

The neighbour notifier drops every update that is not NUD_VALID, so once
the kernel has given up on a gateway - its entry failed to resolve, or
was deleted - the routes behind it keep forwarding in hardware to the
address it last answered from. The sender is never told the gateway is
gone, and the kernel never sees the traffic that would let it notice.

Queue those updates as well, and turn every route the hardware holds
for that gateway into TRAP2CPU, with the TTL bits clear like a route
trapped for want of a port. The CPU then resolves the gateway again, and
the update that brings a valid neighbour programs the route as before,
or it reports the gateway unreachable. A route never written stays as
it is. mlxsw does the same: it stops offloading a next hop whose
neighbour is not valid, and a route left without one traps.

An entry taken out of the table - flushed with its device, or collected
while stale - is marked dead and can keep a NUD_VALID state, so a dead
neighbour counts as not valid too, as it does for mlxsw. The state, the
dead flag and the address are read under the neighbour's lock. On a
table large enough for the periodic collection to run (gc_thresh1, 128
entries by default), the entry of a gateway that only the hardware
sends to goes idle and is collected after gc_stale_time; its routes then
pass through the CPU until the next packet resolves it again.

The RTL839x routes through PIE rules and keeps them as they are, as it
does for a next hop without a port. Its notifier now queues the invalid
updates too, which find nothing to write.

Tested on an RTL9303 with a /24 and a /32 through one gateway that stops
answering ARP until the switch's kernel marks it FAILED. Without this
change both rows stay at forward and the gateway still receives every
echo request; with it both rows trap, none reaches the gateway, and the
sender gets Destination Host Unreachable. Once the gateway answers
again, or after an ip neigh del and the traffic that follows, both rows
are back at forward. With the collection thresholds lowered until the
gateway's stale entry is collected, both rows stayed at forward before
the dead flag was tested and trap with it, back at forward with the
next traffic; a down and up of the gateway's interface, which flushes
its neighbours under the table lock, runs clean. The RTL839x was not
tested.

Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Gennaro Cimmino &lt;gcimmino@rayonra.net&gt;
Link: https://github.com/openwrt/openwrt/pull/25524
Signed-off-by: Markus Stockhausen &lt;markus.stockhausen@gmx.de&gt;
</comment><date>2026-10-02 07:39:05 +0200</date><id>721ab83af6fd77c0f14685a4312a56fd0c18c3ae</id><msg>realtek: l3: trap routes whose gateway lost its neighbour</msg><path><editType>edit</editType><file>target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/l3.c</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/kirkwood/image/Makefile</affectedPath><commitId>7ca89e074d70bd13091a58a04408c1f7e52b81f4</commitId><timestamp>1790927533000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/mail</absoluteUrl><fullName>mail</fullName></author><authorEmail>mail@aparcar.org</authorEmail><comment>kirkwood: store the Ctera firmware members as root

The sysupgrade image of the Ctera C200 V1 differs between builds in the
user and group names of the tar members:

  --rw-r--r-- 0 buildbot  (1000) buildbot  (1000) 175 ... header
  +-rw-r--r-- 0 rebuilder (1000) rebuilder (1000) 175 ... header

ctera-firmware sets the mtime of the members, but not their owner, so
the name of the build user ends up in the image. mvebu fixed the same
recipe in commit 0d42a1258f ("mvebu: improve reproducibility of ctera
firmware"); store the members as root here too.

Link: https://github.com/openwrt/openwrt/pull/25525
Signed-off-by: Paul Spooren &lt;mail@aparcar.org&gt;
</comment><date>2026-10-02 09:52:13 +0200</date><id>7ca89e074d70bd13091a58a04408c1f7e52b81f4</id><msg>kirkwood: store the Ctera firmware members as root</msg><path><editType>edit</editType><file>target/linux/kirkwood/image/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>package/firmware/ipq-wifi/Makefile</affectedPath><commitId>c2eb687d76a04bd66e45fdb2e47998f8f0f565b0</commitId><timestamp>1790929174000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName></author><authorEmail>robimarko@gmail.com</authorEmail><comment>ipq-wifi: update to Git HEAD (2026-10-01)

73091ab6bf52 ci: safely handle changed BDF lists
133ced5d9165 ci: pin BDF workflow dependencies
f4123f64c204 ci: cancel superseded BDF workflow runs
5a222aea811f ci: comment BDF details on pull requests
e7026095be09 ci: parse IPQ9574 BDF files
033d9392777e ci: initialize BDF artifact path at runtime
0fd886523d7c ci: parse ipq9574 BDF as ath11k
dc51f4c40621 ci: skip BDF comments without an artifact
b8e840138fa9 ci: resolve PRs from workflow-run metadata
9a202b023de2 qcn9274: add TP-Link Archer BE800 BDF
dd938a6a367f kiwi: update BDF to v5
6a0f508b9ce3 add TP-Link RE700X board files

Signed-off-by: Robert Marko &lt;robimarko@gmail.com&gt;
</comment><date>2026-10-02 10:19:34 +0200</date><id>c2eb687d76a04bd66e45fdb2e47998f8f0f565b0</id><msg>ipq-wifi: update to Git HEAD (2026-10-01)</msg><path><editType>edit</editType><file>package/firmware/ipq-wifi/Makefile</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/generic/backport-6.18/441-v7.4-spi-spi-qpic-snand-publish-the-ECC-context-to-snandc.patch</affectedPath><commitId>e7eaa9851ff15f7a582132de2f9d05e283fe382f</commitId><timestamp>1790932170000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName></author><authorEmail>robimarko@gmail.com</authorEmail><comment>generic: backport spi-qpic-snand stale ECC pointer fix

qcom_spi_ecc_init_ctx_pipelined() installs the ooblayout but never
publishes the ECC context it allocates, and the cleanup path frees that
context without clearing snandc-&gt;qspi-&gt;ecc. The ooblayout callbacks then
run against a stale pointer.

On IPQ5018 the qcom,smem-part parser makes the first spi-nand probe
defer, so the retry computes the OOB layout from the freed context and
spinand_init() aborts with -512. About half of the boots on a Mercusys
MR80X ended in "Waiting for root device /dev/ubiblock0_1".

Accepted upstream for v7.4 as f94c9b68bb5f, tagged for stable.

Signed-off-by: Johan Alvarado &lt;contact@c127.dev&gt;
Link: https://github.com/openwrt/openwrt/pull/24919
Signed-off-by: Robert Marko &lt;robimarko@gmail.com&gt;
</comment><date>2026-10-02 11:09:30 +0200</date><id>e7eaa9851ff15f7a582132de2f9d05e283fe382f</id><msg>generic: backport spi-qpic-snand stale ECC pointer fix</msg><path><editType>add</editType><file>target/linux/generic/backport-6.18/441-v7.4-spi-spi-qpic-snand-publish-the-ECC-context-to-snandc.patch</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>scripts/mercusys-fwup.py</affectedPath><commitId>b5a84a3323584b47f4dd7a7ebf1bae73630a3af0</commitId><timestamp>1790932170000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName></author><authorEmail>robimarko@gmail.com</authorEmail><comment>scripts: add Mercusys fwup image generator

Mercusys devices whose stock web UI expects an fwup container reject the
tplink-image-2022 container: the loader picks its verification algorithm
from the fw-type string at offset 0x14, which that container does not
write.

Build the container the loader accepts, with the fw-type string, the
support list and the MD5 placeholder digest in place.

This is a separate script rather than a flag on tplink-mkimage-2022.py
because only the first 0x14 bytes match, the BE length and the salted MD5
over file[4:]. That script writes 0xff filler up to 0x1014, a table there
(&gt;2I rootfs_size/num_items, then &gt;I32s2I entries), data at a fixed 0x1814
base, the rootfs first and a packed &gt;4B1I2I soft version. The fwup
container has no table: 0x2c records of name[32] + &gt;III base, next_off,
size, each followed by its own data and chained through next_off until 0,
the rootfs appended after the last record, and the soft version as ASCII
soft_ver: in an ordinary record.

Signed-off-by: Johan Alvarado &lt;contact@c127.dev&gt;
Link: https://github.com/openwrt/openwrt/pull/24919
Signed-off-by: Robert Marko &lt;robimarko@gmail.com&gt;
</comment><date>2026-10-02 11:09:30 +0200</date><id>b5a84a3323584b47f4dd7a7ebf1bae73630a3af0</id><msg>scripts: add Mercusys fwup image generator</msg><path><editType>add</editType><file>scripts/mercusys-fwup.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata</affectedPath><affectedPath>target/linux/qualcommax/ipq50xx/base-files/etc/board.d/02_network</affectedPath><affectedPath>target/linux/qualcommax/ipq50xx/base-files/lib/upgrade/platform.sh</affectedPath><affectedPath>target/linux/qualcommax/ipq50xx/base-files/lib/preinit/09_mount_tp_data</affectedPath><affectedPath>target/linux/qualcommax/dts/ipq5018-mr80x-v2.dts</affectedPath><affectedPath>target/linux/qualcommax/ipq50xx/base-files/etc/board.d/01_leds</affectedPath><affectedPath>target/linux/qualcommax/image/ipq50xx.mk</affectedPath><affectedPath>package/boot/uboot-tools/uboot-envtools/files/qualcommax_ipq50xx</affectedPath><commitId>938f67a519de64dcec10759b2b7203aca086f97a</commitId><timestamp>1790932170000</timestamp><author><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName></author><authorEmail>robimarko@gmail.com</authorEmail><comment>qualcommax: add support for Mercusys MR80X v2

Hardware:
  SoC:    Qualcomm IPQ5018 (2x Cortex-A53)
  RAM:    256 MiB DDR3
  Flash:  128 MiB SPI-NAND (ESMT)
  Switch: Realtek RTL8367S, 4x GbE (3x LAN + 1x WAN), SGMII CPU port
  WiFi:   IPQ5018 2.4 GHz, QCN6122 5 GHz, both 802.11ax
  LEDs:   system (green/amber), WAN, LAN1-3
  Button: reset
  UART:   115200 8N1, 3.3V, on-board header

Wi-Fi is left disabled: 256 MiB is too few for ath11k, same as on the
ELECOM WRC-X3000GS2.

Notes:
- The label reads "Ver 2.20", but the vendor firmware only ever calls the
  board V2: the GPL tree is GPL_MR80Xv2, PRODUCT_NAME is MR80Xv2, the
  running system reports "MR80X V2" and the fwup support list carries
  product_ver 2.0.0. The trailing digits are a production sub-revision,
  so the port is named v2.
- MAC1 runs sgmii through the UNIPHY PCS to RTL8367S port 6. The link is
  wired for HSGMII and 2500base-x does come up, but only when gmac1 and
  the CPU port carry the same phy-mode: the UNIPHY PCS belongs to the
  conduit (pcs-handle = &lt;&amp;uniphy0&gt; in ipq5018-ess.dtsi), so setting the
  CPU port alone leaves the switch running HSGMII into a SerDes still
  clocked for SGMII.
  With both ends at 2500base-x the trunk still dies on some boots: over
  12 reboots, 2 came up with the CPU port passing no traffic at all -
  eth0 transmitting while s00_p06_ifInOctets stayed at 0, no FCS errors,
  the link reporting 2.5 Gbps. That matches the bring-up ordering race
  described in openwrt/openwrt#25153, where the switch end of the trunk
  is configured before the IPQ5018 UNIPHY resets and recalibrates its
  PLL. sgmii has not reproduced it, so the port ships at sgmii until
  that fix lands.
- MAC addresses come from default-mac in the vendor tp_data UBI volume,
  6 raw bytes at offset 0, mounted read-only during preinit:
    label   default-mac
    LAN     default-mac
    WAN     default-mac + 1
    2.4 GHz default-mac - 1
    5 GHz   default-mac - 2
- Sysupgrade A/B ping-pongs rootfs/rootfs_1 via tp_boot_idx, switched
  only after the new slot is fully written. primaryboot stays 0, the
  stock loader and the button recovery rely on it.
- factory.bin is wrapped in the Mercusys fwup container the stock web UI
  accepts (scripts/mercusys-fwup.py). The generic tplink-image-2022
  container is rejected: the loader picks its verification algorithm from
  the fw-type string, which that container does not write.
- The board needs the backported spi-qpic-snand ECC context fix,
  otherwise about half of the boots end in "Waiting for root device
  /dev/ubiblock0_1".

Installation:
  In the stock web UI go to Advanced -&gt; System -&gt; Firmware Update -&gt;
  Local Update, browse for
  openwrt-qualcommax-ipq50xx-mercusys_mr80x-v2-squashfs-factory.bin
  and press UPDATE.

  Tested on stock firmware MR80X(EU)_V2.20_1.1.7 Build 20250415
  (Multi-language).

  The U-Boot web recovery does not accept this image: it verifies an
  RSA1024 signature and has no keyless path. Use the stock web UI.

Signed-off-by: Johan Alvarado &lt;contact@c127.dev&gt;
Link: https://github.com/openwrt/openwrt/pull/24919
Signed-off-by: Robert Marko &lt;robimarko@gmail.com&gt;
</comment><date>2026-10-02 11:09:30 +0200</date><id>938f67a519de64dcec10759b2b7203aca086f97a</id><msg>qualcommax: add support for Mercusys MR80X v2</msg><path><editType>edit</editType><file>target/linux/qualcommax/image/ipq50xx.mk</file></path><path><editType>edit</editType><file>package/boot/uboot-tools/uboot-envtools/files/qualcommax_ipq50xx</file></path><path><editType>edit</editType><file>target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata</file></path><path><editType>edit</editType><file>target/linux/qualcommax/ipq50xx/base-files/etc/board.d/02_network</file></path><path><editType>edit</editType><file>target/linux/qualcommax/ipq50xx/base-files/etc/board.d/01_leds</file></path><path><editType>add</editType><file>target/linux/qualcommax/dts/ipq5018-mr80x-v2.dts</file></path><path><editType>edit</editType><file>target/linux/qualcommax/ipq50xx/base-files/lib/preinit/09_mount_tp_data</file></path><path><editType>edit</editType><file>target/linux/qualcommax/ipq50xx/base-files/lib/upgrade/platform.sh</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://taiha.net/jenkins/user/robimarko</absoluteUrl><fullName>robimarko</fullName><id>robimarko</id></culprit><culprit><absoluteUrl>https://taiha.net/jenkins/user/markus.stockhausen</absoluteUrl><fullName>markus.stockhausen</fullName><id>markus.stockhausen</id></culprit><culprit><absoluteUrl>https://taiha.net/jenkins/user/daniel</absoluteUrl><fullName>daniel</fullName><id>daniel</id></culprit><culprit><absoluteUrl>https://taiha.net/jenkins/user/mail</absoluteUrl><fullName>mail</fullName><id>mail</id></culprit><culprit><absoluteUrl>https://taiha.net/jenkins/user/hauke</absoluteUrl><fullName>hauke</fullName><id>hauke</id></culprit><culprit><absoluteUrl>https://taiha.net/jenkins/user/jonas</absoluteUrl><fullName>jonas</fullName><id>jonas</id></culprit><culprit><absoluteUrl>https://taiha.net/jenkins/user/ansuelsmth</absoluteUrl><fullName>ansuelsmth</fullName><id>ansuelsmth</id></culprit><culprit><absoluteUrl>https://taiha.net/jenkins/user/nbd</absoluteUrl><fullName>nbd</fullName><id>nbd</id></culprit><culprit><absoluteUrl>https://taiha.net/jenkins/user/lynxis</absoluteUrl><fullName>lynxis</fullName><id>lynxis</id></culprit></freeStyleBuild>