From: Anshul Dalal <anshuld@ti.com>
To: Anders Roxell <anders.roxell@linaro.org>, Anshul Dalal <anshuld@ti.com>
Cc: <u-boot@lists.denx.de>, <marex@denx.de>,
<mkorpershoek@kernel.org>, <ilias.apalodimas@linaro.org>,
<trini@konsulko.com>, <michal.simek@amd.com>,
<alchark@flipper.net>, <jerome.forissier@arm.com>,
Siddharth Vadapalli <s-vadapalli@ti.com>,
Chintan Vankar <c-vankar@ti.com>,
<u-boot@lists.u-boot-project.org>
Subject: Re: [PATCH v5 00/75] usb: dwc3: sync code with Linux v6.16
Date: Mon, 10 Aug 2026 15:26:52 +0530 [thread overview]
Message-ID: <DKL6AAZWIDW6.QM05DJXDFOTN@ti.com> (raw)
In-Reply-To: <anmKNYbNQ73Kv3iX@monster>
On Mon Aug 10, 2026 at 1:52 PM IST, Anders Roxell wrote:
> On 2026-08-06 18:47, Anshul Dalal wrote:
>> On Thu, 16 Jul 2026 15:41:30 +0200, Anders Roxell <anders.roxell@linaro.org> wrote:
>> > [...]
>> > This is compile-tested only.
>> >
>> > The series needs the dwc2 endpoint fixes from Mattijs [3]. They are
>> > already on the list and should go in first.
>> >
>> > The branch is also available at [4].
>>
>> Hi Andres,
>
> Hi Anshul,
>
> Thanks for testing on real hardware.
>
>>
>> I was unable to get DFU boot to work on TI devices with this patch series. I
>> tested on AM62p EVM where I don't see any error logs on the console but the
>> DFU device never shows up on the host side (verified with dfu-util and lsusb).
>>
>> I'm not that familiar with dwc3 but the issue seems to be that dwc3_interrupt
>> doesn't report any interrupts.
>
>
> The event path is broken in three places. The main one: in the kernel
> dwc3_check_event_buf() copies the event ring into evt->cache and
> dwc3_process_event_buf() reads from evt->cache. We took the reader but not
> the copy, so it walks a buffer nothing fills. Before the resync we read
> evt->buf directly, so it worked. I think this is what you are hitting, but
> you have the board.
>
> We also never write the count back to GEVNTCOUNT, and dwc3_thread_interrupt()
> gets the controller where it wants the event buffer.
>
> Fix below, it follows the kernel dwc3_invalidate_cache() is ours, it was in
> io.h before the resync and got lost.
>
> --- a/drivers/usb/dwc3/io.h
> +++ b/drivers/usb/dwc3/io.h
> @@ -48,4 +48,12 @@ static inline void dwc3_flush_cache(uintptr_t addr, int length)
> flush_dcache_range((unsigned long)start_addr, (unsigned long)end_addr);
> }
>
> +static inline void dwc3_invalidate_cache(uintptr_t addr, int length)
> +{
> + uintptr_t start_addr = (uintptr_t)addr & ~(CACHELINE_SIZE - 1);
> + uintptr_t end_addr = ALIGN((uintptr_t)addr + length, CACHELINE_SIZE);
> +
> + invalidate_dcache_range((unsigned long)start_addr, (unsigned long)end_addr);
> +}
> +
> #endif /* __DRIVERS_USB_DWC3_IO_H */
>
> --- a/drivers/usb/dwc3/gadget.c
> +++ b/drivers/usb/dwc3/gadget.c
> @@ -4201,23 +4201,46 @@ static irqreturn_t dwc3_check_event_buf(struct dwc3 *dwc)
> {
> struct dwc3_event_buffer *evt;
> + u32 amount;
> u32 count;
> - u32 reg;
>
> evt = dwc->ev_buf;
>
> + if (evt->flags & DWC3_EVENT_PENDING)
> + return IRQ_HANDLED;
> +
> count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(0));
> count &= DWC3_GEVNTCOUNT_MASK;
> if (!count)
> return IRQ_NONE;
>
> + if (count > evt->length) {
> + dev_err(dwc->dev, "invalid count(%u) > evt->length(%u)\n",
> + count, evt->length);
> + return IRQ_NONE;
> + }
> +
> evt->count = count;
> evt->flags |= DWC3_EVENT_PENDING;
>
> /* Mask interrupt */
> - reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(0));
> - reg |= DWC3_GEVNTSIZ_INTMASK;
> - dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), reg);
> + dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0),
> + DWC3_GEVNTSIZ_INTMASK | DWC3_GEVNTSIZ_SIZE(evt->length));
> +
> + /* The controller filled the buffer over DMA, drop our stale lines */
> + dwc3_invalidate_cache((uintptr_t)evt->buf, evt->length);
> +
> + amount = min(count, evt->length - evt->lpos);
> + memcpy(evt->cache + evt->lpos, evt->buf + evt->lpos, amount);
> +
> + if (amount < count)
> + memcpy(evt->cache, evt->buf, count - amount);
> +
> + dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), count);
>
> return IRQ_WAKE_THREAD;
> }
>
> And in dwc3_gadget_uboot_handle_interrupt(), same file:
>
> - struct dwc3_event_buffer *evt;
> - dwc3_thread_interrupt(0, dwc);
> + struct dwc3_event_buffer *evt = dwc->ev_buf;
> + dwc3_thread_interrupt(0, evt);
Thanks for the pointers Anders but I encounter a similar failure even
with the diff you suggested. I enabled some logging for the SPL by
defining the DEBUG macro in the following files (dfu.c spl.c spl_ram.c
dwc3-am62.c composite.c g_dnl.c).
Failure logs:
U-Boot SPL 2026.07-00860-g5a9b7a715be2 (Aug 10 2026 - 15:06:27 +0530)
SYSFW ABI: 4.0 (firmware rev 0x000c '12.1.0--v12.01.00 (Clever Cat)')
Set clock rates for '/a53@0', CPU: 1250MHz at Speed Grade 'V'
SPL initial stack usage: 17104 bytes
SPL malloc() before relocation used 0x64d0 bytes (25 KB)
>>SPL: board_init_r()
spl_init
Trying to boot from DFU
g_dnl_register: g_dnl_driver.name = usb_dnl_dfu
g_dnl_bind: gadget: 0x81c44a98 cdev: 0x81c66bc0
usb_add_config: adding config #1 'usb_dnload'/81c67cc0
g_dnl_do_config: configuration: 0x81c67cc0 composite dev: 0x81c66bc0
adding 'dfu'/81c67d34 to config 'usb_dnload'/81c67cc0
cfg 1/81c67cc0 speeds: high full
usb_add_config: interface 0 = dfu/81c67d34
g_dnl_bind: calling usb_gadget_connect for controller 'dwc3-gadget'
usb_dnl_dfu: ready
<CTRL-C> from user
unbind function 'dfu'/81c67d34
g_dnl_unbind: calling usb_gadget_disconnect for controller 'dwc3-gadget'
Legacy image
u_boot_pos = ffffffff
Raw boot image support not enabled, proceeding to other boot methods
Error: -22
SPL: Unsupported Boot Device!
SPL: failed to boot from all boot devices
### ERROR ### Please RESET the board ###
Succes logs (same debug symbols ontop of main branch):
U-Boot SPL 2026.10-rc1-00209-g0bdd5e5daf95 (Aug 10 2026 - 14:58:28 +0530)
SYSFW ABI: 4.0 (firmware rev 0x000c '12.1.0--v12.01.00 (Clever Cat)')
Set clock rates for '/a53@0', CPU: 1250MHz at Speed Grade 'V'
SPL initial stack usage: 17104 bytes
SPL malloc() before relocation used 0x64d0 bytes (25 KB)
>>SPL: board_init_r()
spl_init
Trying to boot from DFU
g_dnl_register: g_dnl_driver.name = usb_dnl_dfu
g_dnl_bind: gadget: 0x81c44aa4 cdev: 0x81c4af40
usb_add_config: adding config #1 'usb_dnload'/81c4c040
g_dnl_do_config: configuration: 0x81c4c040 composite dev: 0x81c4af40
adding 'dfu'/81c4c0b4 to config 'usb_dnload'/81c4c040
cfg 1/81c4c040 speeds: high full
usb_add_config: interface 0 = dfu/81c4c0b4
g_dnl_bind: calling usb_gadget_connect for controller 'dwc3-gadget'
usb_dnl_dfu: ready
composite_suspend: suspend
set_config: high speed config #1: usb_dnload
non-core control reqa1.03 v0000 i0000 l6
non-core control req21.01 v0000 i0000 l4096
...(repeated)
#non-core control reqa1.03 v0000 i0000 l6
non-core control reqa1.03 v0000 i0000 l6
DOWNLOAD ... OK
Ctrl+C to exit ...
I'm not that familiar with the DW3 driver, let me know if you need me to
test with any further changes.
>
> evt was used there without being set as well.
>
> All of this is in v6 that I plan to send out. I have no AM62p and it is
> only compile tested, so please try it on your board so we know if it
> solves your issue before I send out v6.
I was able to reproduce the issue on beagleplay since it uses the same
DWC3. You can try it locally if you have that board with you by
resetting to DFU mode from U-Boot prompt:
=> mw.w 43000030 53; res
Regards,
Anshul
prev parent reply other threads:[~2026-08-10 9:57 UTC|newest]
Thread overview: 146+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-16 13:41 [PATCH v5 00/75] usb: dwc3: sync code with Linux v6.16 Anders Roxell
2026-07-16 13:41 ` [PATCH v5 01/75] usb: dwc3: restore to original v3.19-rc1 kernel import Anders Roxell
2026-07-27 8:39 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 02/75] usb: dwc3: import from kernel v3.19 Anders Roxell
2026-07-27 8:42 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 03/75] usb: dwc3: import from kernel v4.0 Anders Roxell
2026-07-27 8:44 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 04/75] usb: dwc3: import from kernel v4.1 Anders Roxell
2026-07-27 8:48 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 05/75] usb: dwc3: import from kernel v4.2 Anders Roxell
2026-07-27 8:52 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 06/75] usb: dwc3: import from kernel v4.3 Anders Roxell
2026-07-27 8:53 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 07/75] usb: dwc3: import from kernel v4.4 Anders Roxell
2026-07-27 8:54 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 08/75] usb: dwc3: import from kernel v4.5 Anders Roxell
2026-07-27 8:55 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 09/75] usb: dwc3: import from kernel v4.6 Anders Roxell
2026-07-27 8:56 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 10/75] usb: dwc3: import from kernel v4.7 Anders Roxell
2026-07-27 8:56 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 11/75] usb: dwc3: import from kernel v4.8 Anders Roxell
2026-07-27 8:58 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 12/75] usb: dwc3: import from kernel v4.9 Anders Roxell
2026-07-27 8:59 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 13/75] usb: dwc3: import from kernel v4.10 Anders Roxell
2026-07-27 9:00 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 14/75] usb: dwc3: import from kernel v4.11 Anders Roxell
2026-07-27 9:00 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 15/75] usb: dwc3: import from kernel v4.12 Anders Roxell
2026-07-27 9:01 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 16/75] usb: dwc3: import from kernel v4.13 Anders Roxell
2026-07-27 9:02 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 17/75] usb: dwc3: import from kernel v4.14 Anders Roxell
2026-07-27 9:04 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 18/75] usb: dwc3: import from kernel v4.15 Anders Roxell
2026-07-27 9:08 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 19/75] usb: dwc3: import from kernel v4.16 Anders Roxell
2026-07-27 9:09 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 20/75] usb: dwc3: import from kernel v4.17 Anders Roxell
2026-07-16 13:41 ` [PATCH v5 21/75] usb: dwc3: import from kernel v4.18 Anders Roxell
2026-07-16 13:41 ` [PATCH v5 22/75] usb: dwc3: import from kernel v4.19 Anders Roxell
2026-07-27 9:12 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 23/75] usb: dwc3: import from kernel v4.20 Anders Roxell
2026-07-27 9:13 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 24/75] usb: dwc3: import from kernel v5.0 Anders Roxell
2026-07-27 9:14 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 25/75] usb: dwc3: import from kernel v5.1 Anders Roxell
2026-07-27 9:15 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 26/75] usb: dwc3: import from kernel v5.2 Anders Roxell
2026-07-27 9:19 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 27/75] usb: dwc3: import from kernel v5.3 Anders Roxell
2026-07-27 9:22 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 28/75] usb: dwc3: import from kernel v5.4 Anders Roxell
2026-07-27 9:23 ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 29/75] usb: dwc3: import from kernel v5.5 Anders Roxell
2026-07-27 9:26 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 30/75] usb: dwc3: import from kernel v5.6 Anders Roxell
2026-07-27 12:22 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 31/75] usb: dwc3: import from kernel v5.7 Anders Roxell
2026-07-28 8:50 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 32/75] usb: dwc3: import from kernel v5.8 Anders Roxell
2026-07-28 9:09 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 33/75] usb: dwc3: import from kernel v5.9 Anders Roxell
2026-07-28 9:12 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 34/75] usb: dwc3: import from kernel v5.10 Anders Roxell
2026-07-28 9:17 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 35/75] usb: dwc3: import from kernel v5.11 Anders Roxell
2026-07-28 9:19 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 36/75] usb: dwc3: import from kernel v5.12 Anders Roxell
2026-07-28 9:21 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 37/75] usb: dwc3: import from kernel v5.13 Anders Roxell
2026-07-28 9:22 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 38/75] usb: dwc3: import from kernel v5.14 Anders Roxell
2026-07-28 9:25 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 39/75] usb: dwc3: import from kernel v5.15 Anders Roxell
2026-07-28 9:29 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 40/75] usb: dwc3: import from kernel v5.16 Anders Roxell
2026-07-28 9:30 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 41/75] usb: dwc3: import from kernel v5.17 Anders Roxell
2026-07-28 9:51 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 42/75] usb: dwc3: import from kernel v5.18 Anders Roxell
2026-07-28 9:52 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 43/75] usb: dwc3: import from kernel v5.19 Anders Roxell
2026-07-28 9:54 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 44/75] usb: dwc3: import from kernel v6.0 Anders Roxell
2026-07-28 11:55 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 45/75] usb: dwc3: import from kernel v6.1 Anders Roxell
2026-07-28 11:56 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 46/75] usb: dwc3: import from kernel v6.2 Anders Roxell
2026-07-28 12:04 ` Mattijs Korpershoek
2026-07-28 12:10 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 47/75] usb: dwc3: import from kernel v6.3 Anders Roxell
2026-07-28 12:12 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 48/75] usb: dwc3: import from kernel v6.4 Anders Roxell
2026-07-28 12:16 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 49/75] usb: dwc3: import from kernel v6.5 Anders Roxell
2026-07-28 12:22 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 50/75] usb: dwc3: import from kernel v6.6 Anders Roxell
2026-07-29 9:19 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 51/75] usb: dwc3: import from kernel v6.7 Anders Roxell
2026-07-29 9:21 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 52/75] usb: dwc3: import from kernel v6.8 Anders Roxell
2026-07-29 9:22 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 53/75] usb: dwc3: import from kernel v6.9 Anders Roxell
2026-07-29 9:23 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 54/75] usb: dwc3: import from kernel v6.10 Anders Roxell
2026-07-29 9:25 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 55/75] usb: dwc3: import from kernel v6.11 Anders Roxell
2026-07-29 9:26 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 56/75] usb: dwc3: import from kernel v6.12 Anders Roxell
2026-07-29 9:27 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 57/75] usb: dwc3: import from kernel v6.13 Anders Roxell
2026-07-29 9:28 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 58/75] usb: dwc3: import from kernel v6.14 Anders Roxell
2026-07-29 9:30 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 59/75] usb: dwc3: import from kernel v6.15 Anders Roxell
2026-07-29 9:31 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 60/75] usb: dwc3: import from kernel v6.16 Anders Roxell
2026-07-29 9:32 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 61/75] usb: host: re-import xhci-ext-caps.h " Anders Roxell
2026-07-29 9:34 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 62/75] usb: gadget: re-import epautoconf.c " Anders Roxell
2026-07-29 9:38 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 63/75] usb: udc: re-import udc-core.c " Anders Roxell
2026-07-29 9:41 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 64/75] usb: add helpers needed by the resynced DWC3 code Anders Roxell
2026-07-29 9:56 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 65/75] usb: gadget: trim the gadget API after the resync Anders Roxell
2026-07-29 10:19 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 66/75] usb: gadget: udc: make udc-core build in u-boot Anders Roxell
2026-07-29 11:49 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 67/75] usb: dwc3: make the core driver " Anders Roxell
2026-07-29 12:16 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 68/75] usb: dwc3: make gadget and ep0 " Anders Roxell
2026-07-29 12:27 ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 69/75] usb: dwc3: make the am62 glue " Anders Roxell
2026-07-16 13:42 ` [PATCH v5 70/75] usb: gadget: ci_udc: drop code we do not use Anders Roxell
2026-07-16 13:42 ` [PATCH v5 71/75] usb: gadget: dwc2_udc_otg: fix up after the resync Anders Roxell
2026-07-16 13:42 ` [PATCH v5 72/75] usb: gadget: fix up the function drivers " Anders Roxell
2026-07-16 13:42 ` [PATCH v5 73/75] usb: gadget: fix up the last UDC " Anders Roxell
2026-07-16 13:42 ` [PATCH v5 74/75] usb: fix up musb-new and mtu3 " Anders Roxell
2026-07-20 23:22 ` David Lechner via U-Boot
2026-07-16 13:42 ` [PATCH v5 75/75] usb: host: fix up xhci and cdns3 " Anders Roxell
2026-07-16 19:22 ` [PATCH v5 00/75] usb: dwc3: sync code with Linux v6.16 Marek Vasut
[not found] ` <178602223375.3156999.13542339251028864355.b4-review@b4>
[not found] ` <anmKNYbNQ73Kv3iX@monster>
2026-08-10 9:56 ` Anshul Dalal [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=DKL6AAZWIDW6.QM05DJXDFOTN@ti.com \
--to=anshuld@ti.com \
--cc=alchark@flipper.net \
--cc=anders.roxell@linaro.org \
--cc=c-vankar@ti.com \
--cc=ilias.apalodimas@linaro.org \
--cc=jerome.forissier@arm.com \
--cc=marex@denx.de \
--cc=michal.simek@amd.com \
--cc=mkorpershoek@kernel.org \
--cc=s-vadapalli@ti.com \
--cc=trini@konsulko.com \
--cc=u-boot@lists.denx.de \
--cc=u-boot@lists.u-boot-project.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox