<feed xmlns='http://www.w3.org/2005/Atom'>
<title>staging/xback/scripts, branch master</title>
<subtitle>Staging tree of Koen Vandeputte</subtitle>
<id>https://git.openwrt.org/openwrt/staging/xback/atom?h=master</id>
<link rel='self' href='https://git.openwrt.org/openwrt/staging/xback/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/openwrt/staging/xback/'/>
<updated>2026-10-30T10:06:08Z</updated>
<entry>
<title>build: add Rust package build helpers</title>
<updated>2026-10-30T10:06:08Z</updated>
<author>
<name>Daniel Golle</name>
</author>
<published>2026-10-08T10:21:08Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/openwrt/staging/xback/commit/?id=32f1c26eb631b16b4184ba54d267a3984c8072d0'/>
<id>urn:sha1:32f1c26eb631b16b4184ba54d267a3984c8072d0</id>
<content type='text'>
Add rust-package.mk for target packages written in Rust. The Cargo
environment carries the target triple, CPU flags, the C and C++ flags
for cc-rs, the linker and the ABI-specific sysroot of libstd-rust,
while native build scripts and proc macros keep the host sysroot and
linker. Builds run in the crate's working directory with an explicit
target and offline from the vendor tarball; with a source tree override
(git-src, USE_SOURCE_DIR), which has none, Cargo fetches the locked
crates. Target packages depend on libstd-rust at build time and track
its configuration inputs for rebuilds.

rustc runs the linker with arguments of its own, without TARGET_LDFLAGS.
The linker selection and the -z options that hardening.mk and
package.mk set for every package are passed to rustc, for packages and
for libstd-rust.

When the target triple is the build host's, cc-rs takes the host
compiler for target C code as well. For that triple the C and C++
compiler of cc-rs is scripts/rust-cc-wrapper.sh, linked into
$(STAGING_DIR_HOST)/bin by tools/rust. It runs the target compiler with
the target flags for build scripts whose OUT_DIR lies in the target
triple's directory, and the host compiler for the others.

RUST_PREFER_DYNAMIC is available with any Rust toolchain, controls the
default userspace standard-library linkage and defaults to shared
linking. Packages can override it. Release builds use LTO either way;
rustc runs LTO next to -Cprefer-dynamic only with the unstable
-Zdylib-lto. RUST_PKG_DEPENDS carries the architecture dependencies
and, with shared linking, the libstd-rust runtime dependency. For
packages that keep the default, that dependency is conditional on
RUST_PREFER_DYNAMIC, as .config is not read while package metadata is
collected.

Release builds emit no unwind tables and take the size options of
unstable rustc that libstd-rust is built with: panics without location,
derived Debug output reduced to type names and, with
RUST_PANIC_IMMEDIATE_ABORT, -Cpanic=immediate-abort. Permitting unstable
options for every crate with RUSTC_BOOTSTRAP=1 changes the code of
dependencies: the build scripts of anyhow, thiserror and proc-macro2
then detect unstable features and use them.
scripts/rust-target-wrapper.sh, the RUSTC_WRAPPER of package builds,
adds the options, and -Zdylib-lto with a shared libstd, only to the
target crates cargo compiles, recognised by --target, -C metadata and
--error-format=json, and permits unstable options for that crate alone.
Build scripts and their probes see neither. A package keeps panic
locations with RUST_PKG_LOCATION_DETAIL:=1 and selects the Debug output
with RUST_PKG_FMT_DEBUG. None of this applies with CONFIG_DEBUG.
Packages build the release profile, as maturin, CMake and autotools
projects do, and CONFIG_DEBUG gives it the settings of the dev profile,
ahead of the profile settings of the package. Build paths are mapped out
of packages as out of libstd-rust.

Without a Rust toolchain of the build system, Rust packages build with
rust/host of the packages feed, which installs to $(STAGING_DIR)/host,
so that packages can move from the Rust support of the packages feed
one at a time. RUSTC and CARGO point there, there is neither a sysroot
of libstd-rust nor a shared libstd, the mips64 triples are those its
std is built for, and on the build host's triple the target linker is
set through the Cargo variable. The build dependencies, on libstd-rust
or rust/host, follow USE_RUST_TOOLCHAIN in the package metadata, also
for host builds through rust-host-build.mk. After a switch from None to
a Rust toolchain, the cargo of rust/host still comes first in PATH, so
the help of the toolchain choice names its clean-up.

The file is derived from lang/rust in the packages feed by Luca Barbato
and Donald Hoskins.

Reported-by: Andre Heider &lt;a.heider@gmail.com&gt;
Co-developed-by: Brian Redbeard &lt;redbeard@dead-city.org&gt;
Signed-off-by: Brian Redbeard &lt;redbeard@dead-city.org&gt;
Co-developed-by: Aditya Nugraha &lt;vortexilation@gmail.com&gt;
Signed-off-by: Aditya Nugraha &lt;vortexilation@gmail.com&gt;
Signed-off-by: Daniel Golle &lt;daniel@makrotopia.org&gt;
</content>
</entry>
<entry>
<title>build: add cargo vendor download methods</title>
<updated>2026-10-30T10:06:08Z</updated>
<author>
<name>Daniel Golle</name>
</author>
<published>2026-10-08T10:21:08Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/openwrt/staging/xback/commit/?id=6362669c096b615a6ec0fa9b2b713aa69560ff8b'/>
<id>urn:sha1:6362669c096b615a6ec0fa9b2b713aa69560ff8b</id>
<content type='text'>
Add download methods which try the OpenWrt mirror, then verify an
upstream source and generate an offline vendor archive with
scripts/gen-cargo-vendor-tarball.sh. cargo-vendor-crate takes a .crate
and cargo-vendor-github a GitHub tag archive. cargo-vendor-archive
takes any other archive tar unpacks: release archives in other
compressions, PyPI source archives, crates published with build
metadata in their version. meson-vendor-wraps puts the files of the
selected [wrap-file] wraps of a meson project into
subprojects/packagecache, as mesa fetches its crates through meson
wraps at configure time.

The GitHub method serves the Rust packages of the packages feed, which
are released as tag archives, some with the Cargo project in a
subdirectory. It fetches the archive from codeload.github.com as
$(PKG_NAME)-$(PKG_VERSION).tar.gz. The top directory of every vendor
archive is the one PKG_BUILD_DIR unpacks to, and an existing
.cargo/config.toml of the project stays in front of the vendor
configuration. With the Cargo project in a subdirectory, both are in
the top directory, where cargo finds them wherever a build runs it.
Canonical tar metadata, checksum normalisation and the staged zstd
compressor keep generated archive contents stable. The archive has mode
0644, which the buildbots keep when they copy new files of dl/ to the
source mirror.

Verify PKG_HASH before atomically publishing the archive. Parse cache
options before selecting Cargo, and use the existing locked, verified
downloader for the pinned official Cargo fallback. The generator keeps
its Cargo home in staging_dir/hostpkg/cargo and its work directory in
tmp/, clears inherited CARGO_* settings and takes the staged cargo or
the pinned official one.

Co-developed-by: Brian Redbeard &lt;redbeard@dead-city.org&gt;
Signed-off-by: Brian Redbeard &lt;redbeard@dead-city.org&gt;
Signed-off-by: Daniel Golle &lt;daniel@makrotopia.org&gt;
</content>
</entry>
<entry>
<title>scripts: mkits-qsdk-ipq-image: strip path from description</title>
<updated>2026-10-27T06:19:26Z</updated>
<author>
<name>Daniel Golle</name>
</author>
<published>2026-10-07T07:28:31Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/openwrt/staging/xback/commit/?id=9ec7903e371233ef913f1dee4e2aeb8872efff85'/>
<id>urn:sha1:9ec7903e371233ef913f1dee4e2aeb8872efff85</id>
<content type='text'>
The FIT description of the boot script image is derived from the
file name given on the command line. Take only the basename so that
the script can be passed by path while the description stays the
same.

Signed-off-by: Daniel Golle &lt;daniel@makrotopia.org&gt;
</content>
</entry>
<entry>
<title>qualcommax: ipq50xx: add AVM FRITZ!Box 4050</title>
<updated>2026-10-18T11:14:19Z</updated>
<author>
<name>Leonard Anderweit</name>
</author>
<published>2026-05-18T19:10:23Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/openwrt/staging/xback/commit/?id=8dcdd8fa0edcb5ef56b8aaf985a5900f93c12ea7'/>
<id>urn:sha1:8dcdd8fa0edcb5ef56b8aaf985a5900f93c12ea7</id>
<content type='text'>
Add support for AVM FRITZ!Box 4050, an IPQ5018 based WiFi 6 router.

Hardware
--------
SOC	: Qualcomm IPQ5018 2x A53
RAM	: 512MiB DDR3L Winbond W634GU6QB-11
Flash	: 128MiB Winbond W25N01GWZEIG
ETH	: 4x GbE
Switch	: Qualcomm QCA8337
WiFi	: IPQ5018, QCN6102
USB	: 1x USB 2.0
Buttons	: WLAN, DECT, WPS
LEDs	: Power, WLAN, DECT, WPS, Info green, Info red
DECT	: DCX81AC0CFAE3FNC
Power	: DC 12V 1.5A

UART
----
4 holes, vcc is square
gnd - rx - tx - vcc
3.3v

Installation
------------
1. Download scripts/flashing/eva_ramboot.py, initramfs image and sysupgrade.bin
2. Connect to lan1 and set host ip to 192.168.178.2
3. Power the device and run
   `./eva_ramboot.py --ramsize 0x20000000 --ramstart 0x40000000 192.168.178.1 &lt;initramfs image&gt;`
   when only the 'Power' led blinks
4. Set host ip to 192.168.1.2 and connect to LuCi on 192.168.1.1
5. Sysupgrade in LuCi

Revert to OEM firmware
----------------------
Follow the OEM guide: https://fritz.com/en/pages/recover
The recovery process also works on Linux using Wine.

MAC Addresses
-------------
WAN	: D4:24:DD:XX:XX:FF
LAN	: D4:24:DD:XX:XX:02 (label mac)
2.4GHz	: D4:24:DD:XX:XX:04
5GHz	: D4:24:DD:XX:XX:05

Not Supported
-------------
DECT
analog phone port

Signed-off-by: Leonard Anderweit &lt;leonard.anderweit@gmail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/25056
Signed-off-by: Robert Marko &lt;robimarko@gmail.com&gt;
</content>
</entry>
<entry>
<title>scripts: eva_ramboot: make memory addresses configurable</title>
<updated>2026-10-18T11:14:19Z</updated>
<author>
<name>Leonard Anderweit</name>
</author>
<published>2026-06-17T16:29:41Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/openwrt/staging/xback/commit/?id=cb642c0818358972a31620f583627cd35aa354a1'/>
<id>urn:sha1:cb642c0818358972a31620f583627cd35aa354a1</id>
<content type='text'>
Add arguments --ramsize and --ramstart to make the hardcoded memory
addresses configurable. Use the previous addresses as the default.

Signed-off-by: Leonard Anderweit &lt;leonard.anderweit@gmail.com&gt;
Link: https://github.com/openwrt/openwrt/pull/25056
Signed-off-by: Robert Marko &lt;robimarko@gmail.com&gt;
</content>
</entry>
<entry>
<title>scripts/ext-tools.sh: refresh the stamps with a sub-second timestamp</title>
<updated>2026-10-06T00:05:39Z</updated>
<author>
<name>Hauke Mehrtens</name>
</author>
<published>2026-10-04T21:25:25Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/openwrt/staging/xback/commit/?id=c459c71c4a778eac007f7e541cc9831fadde2a3c'/>
<id>urn:sha1:c459c71c4a778eac007f7e541cc9831fadde2a3c</id>
<content type='text'>
The GitHub CI spends 10 to 18 minutes rebuilding all host tools in most
"Check Kernel patches" jobs, although the tools container ships them
prebuilt. Before, the "Build tools" step took about 10 seconds.

The refresh sets all stamps to one time given to touch -t, which has a
resolution of a full second, so the fraction is zero. The CI job runs the
refresh about 0.2 seconds after actions/checkout finished, and git writes
the tools directory last. Its files therefore often get a timestamp in
the same second as the stamps, but after the full second. Since
timestamp.pl compares the fraction of a second, these source files are
newer than the stamps and every tool gets cleaned and built again.

Take the time from a freshly created temporary file and set all stamps
to it with touch -r. They still share one timestamp, but it now includes
the fraction and is always later than the checkout.

Fixes: 3cf47c5c17dc ("build: compare timestamps with a fraction of a second")
Assisted-by: Claude:claude-opus-5-5
Link: https://github.com/openwrt/openwrt/pull/25626
Signed-off-by: Hauke Mehrtens &lt;hauke@hauke-m.de&gt;
</content>
</entry>
<entry>
<title>qualcommax: add support for TP-Link RE700X</title>
<updated>2026-10-03T18:17:43Z</updated>
<author>
<name>Eduard Hart</name>
</author>
<published>2026-06-29T17:43:57Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/openwrt/staging/xback/commit/?id=a20047f6ee25725a97063af0517aa5c254931a8b'/>
<id>urn:sha1:a20047f6ee25725a97063af0517aa5c254931a8b</id>
<content type='text'>
TP-Link RE700X is a dual-band Wi-Fi 6 (AX3000) range extender based on
Qualcomm IPQ5018 (2.4 GHz) with a QCN6122 (5 GHz) companion radio.

Specifications:
- SoC: Qualcomm IPQ5018 (dual-core ARM Cortex-A53)
- RAM: 256 MiB
- Flash: 128 MiB SPI-NAND (ESMT F50D1G41LB)
- Wi-Fi: IPQ5018 2.4 GHz + QCN6122 5 GHz, both 802.11ax
- Ethernet: 1x Gigabit - IPQ5018 MAC1 (DWMAC) via SGMII/uniphy0 to a
  Realtek RTL8211F (MDIO1 addr 6). The SoC internal GE PHY (MAC0/gmac0)
  is not wired to any external port and stays disabled.
- LEDs: 5, Buttons: reset + WPS
- Power: 100-240 V AC, 50/60 Hz, 0.4 A (internal PSU, wall-plug)
- UART: 3.3 V serial console, 115200 8N1; on-board 4-pad header,
  pinout from top: TX, RX, GND, VCC

MAC addresses (factory_data UBI volume, file default-mac, mounted
read-only in preinit like on the EAP650):
- LAN (label MAC): default-mac
- 2.4 GHz: default-mac + 1
- 5 GHz: default-mac + 2

Calibration data is extracted from the 0:art partition (IPQ5018 at
0x1000, QCN6122 at 0x26800).

Installation:
- From OpenWrt (or after a RAM-boot of the initramfs via U-Boot/TFTP):
  sysupgrade.
- From the stock firmware: openwrt-...-squashfs-factory-webflash.bin via
  the TP-Link web UI (System -&gt; Firmware Upgrade).
  scripts/tplink-re700x-factory.py wraps the rootfs UBI into the stock
  "nvrammanager" upload container (the same "tplink2022"/safeloader
  family as scripts/tplink-mkimage-2022.py); the stock flasher writes it
  into the inactive dual-boot slot. This path has not been tested end to
  end (no unit on stock firmware was left), so keep UART at hand for a
  first install.

The stock U-Boot passes a slot-correct ubi.mtd= (rootfs / rootfs_1 per the
dual-boot index) but with an unmountable root=mtd:ubi_rootfs. The DTS /chosen
inherits ubi.mtd= and appends root=/dev/ubiblock0_1, so OpenWrt boots from
whichever slot the flasher wrote. Like on the EAP650, sysupgrade installs
into the inactive slot and then points tp_boot_idx at it, keeping the
running slot as a fallback; the U-Boot environment is on 0:appsblenv.

The QCN6122/IPQ5018 board-2.bin (BDF) data is supplied via
ipq-wifi-tplink_re700x (openwrt/firmware_qca-wireless).

Wi-Fi is disabled in the DTS for now: with the default ath11k DP ring
sizes both radios exhaust the 256 MiB of RAM. It will be enabled in a
follow-up together with the ath11k patch that selects smaller rings on
low-memory boards, once that has been accepted upstream.

Signed-off-by: Eduard Hart &lt;eduard.hart@etik.com&gt;
Link: https://github.com/openwrt/openwrt/pull/23982
Signed-off-by: Robert Marko &lt;robimarko@gmail.com&gt;
</content>
</entry>
<entry>
<title>package-metadata: drop self-referencing rank from depends-on gates</title>
<updated>2026-10-02T13:13:40Z</updated>
<author>
<name>Mario Andrés Pérez</name>
</author>
<published>2026-09-08T17:14:27Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/openwrt/staging/xback/commit/?id=87215b42ce7cfd2f43a9423788184a74e09917f0'/>
<id>urn:sha1:87215b42ce7cfd2f43a9423788184a74e09917f0</id>
<content type='text'>
Based on:
- 218aad6e2fb604ec79deff99d1aebc87189f005a re-emit a provider's depends
- 38824a13516db2b51067e6851b763b9846209b90 fold the select condition onto re-emitted deps
- 47d6b05ad328e80e4ee05e48aa95462f3518c014 provides-based dep resolution(%vpackage/@vdeps machinery)
- 1fd50531cac9c41334d8f57e2dbc1f50c3572445 "&lt;" rank comparison on provider selection

The provider-selection rank ('A&lt;B', born in 1fd50531) is RHS-anchored
on the stanza owner. When a consumer +selects a provider of a PROVIDES
target served by &gt;=2 providers, the provider's dependencies are
re-emitted into the consumer's kconfig block under this rank. A bare
@() arch/feature dep folded under it becomes:

  depends on !(PACKAGE_librespeed-cli-rust&lt;PACKAGE_librespeed-common)
              || (aarch64||arm||i386||i686||loongarch64||mips||...)

Kconfig treats any occurrence of a symbol in a dependency edge as an
edge, even negated under '!() ||', so PACKAGE_librespeed-common lands
in its own dir_dep: a recursive dependency self-loop.

The self-reference reaches the owner's stanza through any re-emitted
dependency emitted as depends-on: provider '@()' arch gates, plain
deps on a second virtual that '||'-expand, and plain deps on ordinary
packages inheriting the rank-bearing parent. Rank is therefore
generated only for select emission: it is built into a separate
variable and folded into the select gate alone, while re-emission
carries the pre-rank negation instead (!OTHER / !(A||B) over all
leftovers, exactly as before 1fd50531). Within a stanza no depends-on
gate can therefore self-reference, except for self-providing
consumers (provide and depend on the same name), which keep
historical behavior; user conditions, parent conditions and all
select arbitration remain untouched.

Fixes: 1fd50531cac9 ("metadata: ensure one dependency provider to be y if a package is y")
Signed-off-by: Mario Andrés Pérez &lt;mapb_@outlook.com&gt;
</content>
</entry>
<entry>
<title>scripts: add Mercusys fwup image generator</title>
<updated>2026-10-02T09:09:30Z</updated>
<author>
<name>Johan Alvarado</name>
</author>
<published>2026-08-26T16:30:43Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/openwrt/staging/xback/commit/?id=b5a84a3323584b47f4dd7a7ebf1bae73630a3af0'/>
<id>urn:sha1:b5a84a3323584b47f4dd7a7ebf1bae73630a3af0</id>
<content type='text'>
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;
</content>
</entry>
<entry>
<title>build: remove the AUDIO_SUPPORT and DISPLAY_SUPPORT symbols</title>
<updated>2026-09-29T14:29:43Z</updated>
<author>
<name>Daniel Golle</name>
</author>
<published>2026-09-26T20:41:59Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/openwrt/staging/xback/commit/?id=da6323e54c9cb75479eb5be5c83d43a15d5c3c34'/>
<id>urn:sha1:da6323e54c9cb75479eb5be5c83d43a15d5c3c34</id>
<content type='text'>
Nothing tests either symbol any more. AUDIO_SUPPORT was also selected by
PCI_SUPPORT and USB_SUPPORT, which stood for "a sound card could be
plugged in here": audio hardware sits behind MMC, SPI, a Bluetooth UART
or an SoC PCM block just as often, so the inference never held. The
display feature was derived from a literal CONFIG_VGA_CONSOLE or CONFIG_FB
in a kernel fragment, which misses every target whose fbdev came from DRM
emulation.

Delete both symbols, the two selects, the feature translations and the
derivation.

Signed-off-by: Daniel Golle &lt;daniel@makrotopia.org&gt;
</content>
</entry>
</feed>
