1. Boot WRC-X3000GS3 in router mode normally
2. Access to the WebUI ("http://192.168.2.1/") on the device and open
the firmware update page ("ファームウェア更新")
3. Select the OpenWrt factory.bin image and click apply ("適用") button
4. Wait ~120 seconds to complete flashing
Switching to the stock firmware:
1. Load the elecom.sh script
. /lib/upgrade/elecom.sh
2. Check the current index of firmware partition
mstc_rw_bootnum
3. Set the bootnum to opposite value between 1 and 2
mstc_rw_bootnum <value>
example:
- step2 returned "1": mstc_rw_bootnum 2
- step2 returned "2": mstc_rw_bootnum 1
4. Reboot
Notes:
- ELECOM sells (or sold) multiple models as AX3000 class with different
hardwares:
Add new mtdsplit parser "mstc-boot" for the devices manufactured by MSTC
(Mitra Star Technology Corp.). This is necessary to handle dual-boot on
those devices.
This parser splits kernel+rootfs or only rootfs(or UBI) based on the
image in the firmware partition or pre-defined partitions in dts, and
"bootnum" value in the "persist" (or "working") partition.
Note: "bootnum" is used for switching active firmware partitions on the
devices manufactured by MSTC and '1' or '2' are used on most
devices. But some devices use '0' or '1'. (example: I-O DATA
WN-DEAX1800GR)
Sequence:
1. obtain "bootnum" value
2. child nodes exsist (regardless of bootnum)
-> fixed partitions
(active parts : without bootnum (ex.: "kernel", "rootfs")
inactive parts: with bootnum (ex.: "kernel2", "rootfs2"))
3. current partition is active (dt bootnum == mtd bootnum)
-> image-based partitions
Device Tree:
- common
- mstc,bootnum : "bootnum" value for the mtd partition (0/1/2)
- mstc,persist : phandle of "persist" partition containing "bootnum"
value
- fixed partitions
- #address-cells: indicate cell count of address of child nodes (1)
- #size-cells : indicate cell count of size of child nodes (1)
- (child nodes) : define the child partitions
- reg : define the offset and size
- label-base : define the base name of the partition
- (example) : base:"kernel"->"kernel"(active)/"kernel2"(inactive)
Shiji Yang [Wed, 18 Jun 2025 11:50:39 +0000 (19:50 +0800)]
ipq40xx: migrate wifi configuration device paths for 6.12 kernel
The device tree PCIe host node name has been changed in the new
6.12 kernel[1]. Hence we have to update the wifi device path to
make sure it can work properly.
This script is based on:
target/linux/qualcommax/ipq807x/base-files/etc/hotplug.d/ieee80211/05-wifi-migrate
Shiji Yang [Sun, 1 Jun 2025 05:56:30 +0000 (13:56 +0800)]
ipq40xx: dts: fix incorrect PCIe bus number
On the ipq40xx platform, the bus range is 1 - 255. Therefore, bus
number 0 is clearly incorrect. Change the bus number to 1, just
like other ipq40xx devices. This patch fixes the following dtc
warnings on 6.12 kernel:
qcom-ipq4019.dtsi:476.5-29: Warning (pci_device_bus_num): /soc/pcie@40000000/pcie@0/wifi@0,0:bus-range: PCI bus number 0 out of range, expected (1 - 255)
qcom-ipq4019.dtsi:476.5-29: Warning (pci_device_bus_num): /soc/pcie@40000000/pcie@0/wifi@0,0:bus-range: PCI bus number 0 out of range, expected (1 - 255)
These devices' reg cell[0] is equal to 0x10000, hence the correct
node unitname should be "0,0". This patch fixes the following dtc
warnings for 6.12 kernel:
qcom-ipq4019-map-ac2200.dts:211.11-216.4: Warning (pci_device_reg): /soc/pcie@40000000/pcie@0/wifi@1,0: PCI unit address format error, expected "0,0"
qcom-ipq4019-rt-ac42u.dts:315.11-319.4: Warning (pci_device_reg): /soc/pcie@40000000/pcie@0/wifi@1,0: PCI unit address format error, expected "0,0"
qcom-ipq4019-fritzbox-7530.dts:318.10-321.4: Warning (pci_device_reg): /soc/pcie@40000000/pcie@0/dsl@1,0: PCI unit address format error, expected "0,0"
qcom-ipq4019-fritzrepeater-3000.dts:239.11-245.4: Warning (pci_device_reg): /soc/pcie@40000000/pcie@0/wifi@1,0: PCI unit address format error, expected "0,0"
qcom-ipq4019-gl-b2200.dts:340.11-348.4: Warning (pci_device_reg): /soc/pcie@40000000/pcie@0/wifi@1,0: PCI unit address format error, expected "0,0"
qcom-ipq4019-ea8300.dts:97.11-102.4: Warning (pci_device_reg): /soc/pcie@40000000/pcie@0/wifi@1,0: PCI unit address format error, expected "0,0"
qcom-ipq4019-mr8300.dts:83.11-88.4: Warning (pci_device_reg): /soc/pcie@40000000/pcie@0/wifi@1,0: PCI unit address format error, expected "0,0"
qcom-ipq4019-whw03v2.dts:234.11-241.4: Warning (pci_device_reg): /soc/pcie@40000000/pcie@0/wifi@1,0: PCI unit address format error, expected "0,0"
qcom-ipq4029-insect-common.dtsi:282.11-287.4: Warning (pci_device_reg): /soc/pcie@40000000/pcie@0/wifi@1,0: PCI unit address format error, expected "0,0"
qcom-ipq4029-insect-common.dtsi:282.11-287.4: Warning (pci_device_reg): /soc/pcie@40000000/pcie@0/wifi@1,0: PCI unit address format error, expected "0,0"
qcom-ipq4019-lbr20.dts:488.11-495.4: Warning (pci_device_reg): /soc/pcie@40000000/pcie@0/wifi@1,0: PCI unit address format error, expected "0,0"
qcom-ipq4019-orbi.dtsi:317.11-322.4: Warning (pci_device_reg): /soc/pcie@40000000/pcie@0/wifi@1,0: PCI unit address format error, expected "0,0"
qcom-ipq4019-orbi.dtsi:317.11-322.4: Warning (pci_device_reg): /soc/pcie@40000000/pcie@0/wifi@1,0: PCI unit address format error, expected "0,0"
qcom-ipq4019-orbi.dtsi:317.11-322.4: Warning (pci_device_reg): /soc/pcie@40000000/pcie@0/wifi@1,0: PCI unit address format error, expected "0,0"
qcom-ipq4019-orbi.dtsi:317.11-322.4: Warning (pci_device_reg): /soc/pcie@40000000/pcie@0/wifi@1,0: PCI unit address format error, expected "0,0"
qcom-ipq4019-orbi.dtsi:317.11-322.4: Warning (pci_device_reg): /soc/pcie@40000000/pcie@0/wifi@1,0: PCI unit address format error, expected "0,0"
qcom-ipq4019-orbi.dtsi:317.11-322.4: Warning (pci_device_reg): /soc/pcie@40000000/pcie@0/wifi@1,0: PCI unit address format error, expected "0,0"
qcom-ipq4019-a62.dts:218.11-225.4: Warning (pci_device_reg): /soc/pcie@40000000/pcie@0/wifi@1,0: PCI unit address format error, expected "0,0"
qcom-ipq4019-pa2200.dts:198.11-205.4: Warning (pci_device_reg): /soc/pcie@40000000/pcie@0/wifi@1,0: PCI unit address format error, expected "0,0"
qcom-ipq4019-mf18a.dts:478.11-484.4: Warning (pci_device_reg): /soc/pcie@40000000/pcie@0/wifi@1,0: PCI unit address format error, expected "0,0"
qcom-ipq4019-mf289f.dts:429.11-435.4: Warning (pci_device_reg): /soc/pcie@40000000/pcie@0/wifi@1,0: PCI unit address format error, expected "0,0"
Shiji Yang [Sat, 31 May 2025 06:56:55 +0000 (14:56 +0800)]
ipq40xx: dts: compatibility changes for 6.12 kernel
- Remove duplicate PCIe bridge. A default bridge node has been
added upstream.
- Do not refer to the qca807x node. This node label has been
removed. We can disable the qca807x phy in mdio node.
Shiji Yang [Tue, 6 May 2025 11:30:52 +0000 (19:30 +0800)]
ipq40xx: refresh kernel symbol configs
This is a preparation for introducing the 6.12 kernel support.
All configs are automatically refreshed. In theory, they will
generate the same .config files in the kernel build directory
as before.
Daniel Golle [Thu, 17 Jul 2025 20:00:00 +0000 (21:00 +0100)]
targets: add USES_PM auto-feature
Not all targets support power management, some older or more simple
targets don't have CONFIG_PM set. Allow kernel module packages to
depend on USES_PM to only be available on targets which got
CONFIG_PM=y in their kernel config.
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
Daniel Golle [Sat, 19 Jul 2025 19:35:26 +0000 (20:35 +0100)]
uboot-mediatek: restore Ethernet PHY drivers
Partially revert commit 332645a610 ("uboot-mediatek: sync with
mtk-openwrt/u-boot 20250711") by dropping unused PHY drivers which come
with large embedded firmware (and are hence inacceptable for upstream)
and restoring our previous version of the Airoha EN8811H driver which is
known to work and load firmware from the eMMC boot1 hardware partition
instead of embedding it in the driver.
In future we may switch to the upstream Airoha EN8811H driver which
allows loading the firmware either from a filesystem or overloading the
en8811h_read_fw() for board which may eg. store that firmware directly
inside a eMMC hardware partition or UBI volume, like the BPi-R3 mini
does.
See also:
https://patchwork.ozlabs.org/project/uboot/patch/20250615131243.30770-1-lucienzx159@gmail.com/
Fixes: 332645a610 ("uboot-mediatek: sync with mtk-openwrt/u-boot 20250711") Reported-by: Adrian Bente Signed-off-by: Daniel Golle <daniel@makrotopia.org>
kirkwood: add kmod-ata-ahci as default to ix4-200d
The ix4-200d is a 4 bay NAS supported since OpenWrt 23.05. Drive trays
controller. Due to a kernel-related issue with the SATA controller,
trays #1 and #2 were not recognized. This issue has been fixed in
kernel 6.10, so with the adoption of kernel 6.12 in the Kirkwood
target trays #1 and #2 can now be made accessible. This requires the
kmod-ata-ahci package, which this commit adds as default to the
makefile.
mbedtls: Apply configuration in Configure instead of Prepare
This ensures mbedtls_config.h is correctly updated and the package rebuilt
accordingly when configuration options are changed after the source is first
prepared.
Daniel Golle [Thu, 17 Jul 2025 18:25:38 +0000 (19:25 +0100)]
targets: add PINCTRL_SUPPORT auto-feature
Not all targets have CONFIG_PINCTRL=y set in their kernel config.
Let's introduce a feature for that so kernel module packages which
select or depend on CONFIG_PINCTRL=y may depend on that, so we can
try to prevent leaking CONFIG_PINCTRL=y also into targets which do
not require it.
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
Shiji Yang [Wed, 9 Jul 2025 16:35:29 +0000 (00:35 +0800)]
uboot-mediatek: support getting legacy uImage size
Most ramips target devices use the legacy uImage format. This
patch extends the imsz/imszb commands to support detecting the
image size of legacy uImage.
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
Shiji Yang [Tue, 8 Jul 2025 12:33:11 +0000 (20:33 +0800)]
uboot-mediatek: fix mt7622 rfb1 build
Add back the default LK image header to generate u-boot-mtk.bin. This
is the default behavior before u-boot v2022.01. If "u-boot-mtk.bin"
doesn't boot, please try "u-boot.bin" and report it.
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
Daniel Golle [Sat, 12 Jul 2025 02:41:19 +0000 (03:41 +0100)]
kernel: modules: input: add modules for PS/2 mouse support
Package kernel modules for PS/2 mouse support, mostly to allow
using touchpads and trackpoints built-into laptops (many of those
are connected using classic i8052-compatible PS/2 I/O).
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
Daniel Golle [Sat, 19 Jul 2025 01:53:22 +0000 (02:53 +0100)]
kernel: add missing dependency on kmod-drm to kmod-i2c-hid
Buildbot revealed that on the x86/geode target, on which CONFIG_DRM=y isn't set,
kmod-i2c-hid misses the dependency on kmod-drm. Fix that to fix the build for
x86/geode.
Fixes: c83e275c9b ("kernel: package modules for I2C HID devices") Signed-off-by: Daniel Golle <daniel@makrotopia.org>
realtek: avoid interrupt storm on mass packet receive
RTL83xx devices have two types of receive interrupts for each of its
8 rings. One for packet received and another for ring overflow. When
the switch is flooded with incoming packets the receive handler will
disable the packet receive notification but still keeps the overflow
notification enabled. While the receive path "slowly" processes the
received packets each new packet triggers the overflow IRQ again. The
device becomes unresponsive and eventually produces messages like:
[18441.709764] rcu: Stack dump where RCU GP kthread last ran:
[18441.727892] Sending NMI from CPU 1 to CPUs 0:
[18441.742300] NMI backtrace for cpu 0 skipped: idling at 0x8080e994
[18415.251700] rcu: INFO: rcu_sched detected stalls on CPUs/tasks:
[18415.271350] rcu: 0-...!: (0 ticks this GP) idle=d740/0/0x0 ...
[18415.303046] rcu: (detected by 1, t=6004 jiffies, g=230925, ...
[18415.326095] Sending NMI from CPU 1 to CPUs 0:
[18415.340540] NMI backtrace for cpu 0
Fix this issue by always disabling receive and overflow interrupts at
the same time.
Test with hping3 --udp -p 5021 -d 1400 --flood 192.168.2.72
Before (3sec run):
[183260.324846] rtl838x-eth 1b00a300.ethernet eth0: RX buffer overrun: status 0x101, mask: 0x7ffeff
[183260.340524] rtl838x-eth 1b00a300.ethernet eth0: RX buffer overrun: status 0x1, mask: 0x7ffeff
[183260.345799] net_ratelimit: 489997 callbacks suppressed
After (3 sec run):
[ 373.981479] rtl838x-eth 1b00a300.ethernet eth0: rx ring overrun: status 0x101, mask: 0x7fffff
[ 374.031118] rtl838x-eth 1b00a300.ethernet eth0: rx ring overrun: status 0x101, mask: 0x7fffff
[ 377.919996] net_ratelimit: 34 callbacks suppressed
Add an OpenWrt-based U-Boot build for this device, allowing for more
flexibility and customization.
Expected behaviour
------------------
When plugging the device, keeping the reset button pressed will enter
TFTP recovery mode: the board will send requests for the initramfs file
(openwrt-mediatek-filogic-glinet_gl-mt2500-initramfs-kernel.bin) from
IP 192.168.1.1 to 192.168.1.10 TFTP server.
The bootloader will populate the environment with the unit serial number
as reported by the "sn" value in eMMC, the "sn_bak" value, the country
code and ddns. WAN and LAN MAC addresses are reported in the environment
as well.
Limitations
-----------
No web interface is available, and only the LAN port can be used for
system recovery.
Notes
-----
This port has been tested with the Maxlinear version only, and with a
board that does not exhibit eMMC communication problems. Even though eMMC
frequency has been lowered, some testing is probably needed and always
very welcome.
A -factory image has been introduced, and is only needed when using the
"Load Firmware via TFTP then write to eMMC." boot menu function.
The device has not been converted to use uImage.FIT including the rootfs
to keep compatibility with stock bootloader and firmware.
Installation
------------
From a Linux root shell:
0. Transfer the needed files to the board, placing them in /tmp.
1. Make sure your U-Boot environment is erased: all of my units came with
unpopulated environment, but I am not sure this is always the case.
Issue the command
cat /dev/zero >/dev/mmcblk0p2
(you will get a "no space left" error, which is reasonable and expected).
2. Unlock the eMMC boot area where BL2 is located:
echo 0 >/sys/block/mmcblk0boot0/force_ro
3. Write the new BL2 code:
cat openwrt-mediatek-filogic-glinet_gl-mt2500-emmc-preloader.bin >/dev/mmcblk0boot0
4. Write new BL31+U-Boot image:
cat openwrt-mediatek-filogic-glinet_gl-mt2500-emmc-bl31-uboot.fip >/dev/mmcblk0p4
5. Reboot.
uboot-mediatek: GatoNetworks GDSP support fixes and updates
This commit updates the OpenWrt-based U-Boot for this device, allowing
to boot a FIT firmware image stored in an SD card.
The environment has been updated accordingly to allow for managing images
on the two different supported firmware boot media configurations
(NOR or SDMMC).
Erasing the U-Boot environment when upgrading is recommended, so that
the correct DTS overlay is applied.
New behaviour
-------------
The default environment "bootconf" variable is set to
config-1#mt7981b-gatonetworks-gdsp-gps
rendering the GPS module accessible.
You may set it to something like
config-1#mt7981b-gatonetworks-gdsp-sd
to be able to use the MMC controller.
To boot from a firmware image stored in an SD card, you may set the
bootmedia environment variable:
# fw_setenv bootmedia sd
and reboot.
Should the bootmedia variable be absent or it's content not recognized
as valid (e.g., does not contain "nor" or "sd"), NOR boot will be
attempted.
mediatek: filogic: add SD card support to GatoNetworks GDSP
The device is equipped with a GPS module, reporting data via /dev/ttyS1.
A TF card reader is also present. Only one of those components can be
used at once, since they share some PINs.
This commit adds two devicetree overlays to allow for the user to select
the desired configuration. Another overlay configuration to allow booting
from SD card is provided.
Shiji Yang [Tue, 27 May 2025 14:23:39 +0000 (22:23 +0800)]
lantiq: add the missing function pointer ltq_pci_plat_dev_init
Partial revert upstream commit 075dd2eef025 ("MIPS: lantiq: Remove
unused function pointer variables") to fix the build error:
mips-openwrt-linux-musl-ld: arch/mips/lantiq/xway/ath5k_eep.o: in function `of_ath5k_eeprom_probe':
arch/mips/lantiq/xway/ath5k_eep.c:(.init.text+0x31c): undefined reference to `ltq_pci_plat_dev_init'
mips-openwrt-linux-musl-ld: arch/mips/lantiq/xway/ath5k_eep.c:(.init.text+0x338): undefined reference to `ltq_pci_plat_dev_init'
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
lantiq: fix vmmc driver build warnings
Shiji Yang [Fri, 9 May 2025 13:55:07 +0000 (21:55 +0800)]
lantiq: fix i2c driver compatibility issue on 6.12 kernel
* Drop obsolete flag I2C_CLASS_SPD. [1]
* Change .remove callback return type to NULL.
* Use strscpy instead of strlcpy.
This patch fixes the following build errors:
drivers/i2c/busses/i2c-lantiq.c:599:41: error: 'I2C_CLASS_SPD' undeclared (first use in this function); did you mean 'I2C_CLASS_HWMON'?
599 | adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
| ^~~~~~~~~~~~~
| I2C_CLASS_HWMON
drivers/i2c/busses/i2c-lantiq.c:600:9: error: implicit declaration of function 'strlcpy'; did you mean 'strncpy'? [-Wimplicit-function-declaration]
600 | strlcpy(adap->name, DRV_NAME "-adapter", sizeof(adap->name));
| ^~~~~~~
| strncpy
drivers/i2c/busses/i2c-lantiq.c:729:19: error: initialization of 'void (*)(struct platform_device *)' from incompatible pointer type 'int (*)(struct platform_device *)' [-Wincompatible-pointer-types]
729 | .remove = ltq_i2c_remove,
|
[1] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-6.12.y&id=e61bcf42d290e73025bab38e0e55a5586c2d8ad5 Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
The .remove has been converted to .remove_new in the 6.12 kernel.
We have to change remove function return type from int to void
to match the upstream changes.
Import patches from kernel 6.13:
- net: dsa: realtek: Use for_each_child_of_node_scoped()
- net: dsa: realtek: rtl8365mb: Make use of irq_get_trigger_type()
- net: dsa: realtek: rtl8366rb: Make use of irq_get_trigger_type()
Jan Hoffmann [Fri, 11 Jul 2025 18:31:29 +0000 (20:31 +0200)]
ltq-adsl-mei: check status register before reading mailbox messages
The interrupt handler reads from the mailbox if no other reason for the
interrupt is known. If a spurious interrupt is received just after a
mailbox message has been sent, this means that the response to the
previous message is read again and returned by DSL_BSP_SendCMV instead
of the actual response.
To fix this, check the status register before reading from the mailbox
in the interrupt handler.
Tested on Fritzbox 7320. Without this change, there is occasionally a
kernel panic due to an out-of-bounds memory access in the ltq-adsl
driver (in DSL_DRV_DEV_G997_SnrAllocationNscGet), as a result of an
incorrect value returned by DSL_DRV_DANUBE_CmvRead. This is reproducible
by calling "dsl_cpe_pipe.sh g997dsnrg 1 1" multiple times.
Tony Ambardar [Tue, 15 Jul 2025 05:43:17 +0000 (22:43 -0700)]
perf: fix build on mips
Building perf on mips/malta fails on intel-pt-decoder due to a header issue
previously seen in f434643857 ("perf: fix build on PowerPC"):
In file included from util/intel-pt-decoder/intel-pt-insn-decoder.c:12:
util/intel-pt-decoder/../../../arch/x86/include/asm/insn.h: In function 'insn_field_set':
util/intel-pt-decoder/../../../arch/x86/include/asm/insn.h:56:21: error: implicit declaration of function '__cpu_to_le32'; did you mean 'cpu_to_le32'? [-Wimplicit-function-declaration]
56 | p->little = __cpu_to_le32(v);
| ^~~~~~~~~~~~~
| cpu_to_le32
util/intel-pt-decoder/../../../arch/x86/include/asm/insn.h: In function 'insn_set_byte':
util/intel-pt-decoder/../../../arch/x86/include/asm/insn.h:64:20: error: implicit declaration of function '__le32_to_cpu'; did you mean 'le32_to_cpu'? [-Wimplicit-function-declaration]
64 | p->value = __le32_to_cpu(p->little);
| ^~~~~~~~~~~~~
| le32_to_cpu
Extend the previous powerpc fix to mips, disabling intel-pt-decoder build.
Daniel Golle [Sat, 12 Jul 2025 04:26:50 +0000 (05:26 +0100)]
kernel: package modules for I2C HID devices
Package driver modules for I2C HID devices such as touchpads,
touchscreens and trackpoints found on some laptops. Only the ACPI
firmware variant of the driver is packaged for now as that's what I got
for testing.
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
Daniel Golle [Tue, 15 Jul 2025 14:56:15 +0000 (15:56 +0100)]
x86: modules: add packages for Intel LPSS drivers
Add driver packages for Intel Low-Power Subsystem devices which are part
of some Intel chipsets. They are mainly needed to have access to the I2C
bus used for HID devices.
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
Leo Barsky [Mon, 14 Jul 2025 14:44:57 +0000 (10:44 -0400)]
kernel: bump 6.12 to 6.12.38
Changelog: https://cdn.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.38
Minor kernel update with a single fix:
- x86/CPU/AMD: Properly check the TSA microcode
Leo Barsky [Mon, 14 Jul 2025 14:53:33 +0000 (10:53 -0400)]
kernel: bump 6.6 to 6.6.98
Changelog: https://cdn.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.6.98
Minor kernel update with a single fix:
- x86/CPU/AMD: Properly check the TSA microcode
Automatically refreshed:
- airoha/patches-6.6/901-snand-mtk-bmt-support.patch
qualcommax: ipq50xx: update qcn6122 caldata offset of yuncore ax830
The current offset used for extracting QCN6122 calibration data
is incorrect on the Yuncore AX830. This patch corrects the
offset to ensure proper WiFi initialization.
b3e3c05 client: don't send stray EOF chunk on connection timeout fad0d05 proc: inhibit chunked transfer encoding on existing TEs or known length 3d6f01b file: prevent writes beyond end of uh_buf on enumerating directories c7294e7 client: reject requests with multiple content-lengths and/or TEs 7e64e8b client: Allow sending content in DONE state