On 5/30/25 17:38, Tim Harvey wrote:
Call schedule() in net_lwip_rx() to service U-Boot tasks and
actions during packet rx.

As a cleanup also move sys_check_timeouts() here and remove it from the
functions that call net_lwip_rx().

This resolves the issue of an active watchdog resetting the board on
long network activities.

Suggested-by: Jerome Forissier <jerome.foriss...@linaro.org>
Signed-off-by: Tim Harvey <thar...@gateworks.com>
---
v2:
  - remove duplication of sys_check_timeouts() from functions that call
    net_lwip_rx()
---
  net/lwip/dhcp.c     | 1 -
  net/lwip/dns.c      | 1 -
  net/lwip/net-lwip.c | 7 +++++++
  net/lwip/ping.c     | 1 -
  net/lwip/tftp.c     | 1 -
  net/lwip/wget.c     | 1 -
  6 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/net/lwip/dhcp.c b/net/lwip/dhcp.c
index 92bd7067a7fb..b79b746db390 100644
--- a/net/lwip/dhcp.c
+++ b/net/lwip/dhcp.c
@@ -57,7 +57,6 @@ static int dhcp_loop(struct udevice *udev)
        /* Wait for DHCP to complete */
        do {
                net_lwip_rx(udev, netif);
-               sys_check_timeouts();
                bound = dhcp_supplied_address(netif);
                if (bound)
                        break;
diff --git a/net/lwip/dns.c b/net/lwip/dns.c
index 19172ac959ac..738f8bf3196b 100644
--- a/net/lwip/dns.c
+++ b/net/lwip/dns.c
@@ -91,7 +91,6 @@ static int dns_loop(struct udevice *udev, const char *name, 
const char *var)
                        net_lwip_rx(udev, netif);
                        if (dns_cb_arg.done)
                                break;
-                       sys_check_timeouts();
                        if (ctrlc()) {
                                printf("\nAbort\n");
                                break;
diff --git a/net/lwip/net-lwip.c b/net/lwip/net-lwip.c
index f05c4cd3f64f..e8d4cc542ed8 100644
--- a/net/lwip/net-lwip.c
+++ b/net/lwip/net-lwip.c
@@ -13,8 +13,10 @@
  #include <lwip/etharp.h>
  #include <lwip/init.h>
  #include <lwip/prot/etharp.h>
+#include <lwip/timeouts.h>
  #include <net.h>
  #include <timer.h>
+#include <u-boot/schedule.h>
/* xx:xx:xx:xx:xx:xx\0 */
  #define MAC_ADDR_STRLEN 18
@@ -284,6 +286,11 @@ int net_lwip_rx(struct udevice *udev, struct netif *netif)
        int len;
        int i;
+ /* lwIP timers */
+       sys_check_timeouts();
+       /* Other tasks and actions */
+       schedule(

Some scheduled tasks have a long duration, specifically video_sync_all() called via video_idle(). This change will lead to lost packages.


@Tom, Simon

The EFI code was impacted by 29caf9305b6f ("cyclic: Use schedule() instead of WATCHDOG_RESET()"). This added schedule() calls to EFI networking. Package losses can expected if schedule() takes more than 1 µs. This is much shorter than the time needed for synchronizing a 1 MiB frame buffer. The cyclic framework was explicitly meant for short duration function calls, not for long duration tasks like syncing the video frame buffer.


I think we should remove video_idle() from the cyclic framework. video_sync_all() should only be triggered if there is video output.

Best regards

Heinrich

+
        if (!eth_is_active(udev))
                return -EINVAL;
diff --git a/net/lwip/ping.c b/net/lwip/ping.c
index d8042ceecf99..1390b914f7d8 100644
--- a/net/lwip/ping.c
+++ b/net/lwip/ping.c
@@ -136,7 +136,6 @@ static int ping_loop(struct udevice *udev, const ip_addr_t 
*addr)
        ping_send(&ctx);
do {
-               sys_check_timeouts();
                net_lwip_rx(udev, netif);
                if (ctx.alive)
                        break;
diff --git a/net/lwip/tftp.c b/net/lwip/tftp.c
index fae701bad2eb..7495dc077ba5 100644
--- a/net/lwip/tftp.c
+++ b/net/lwip/tftp.c
@@ -200,7 +200,6 @@ static int tftp_loop(struct udevice *udev, ulong addr, char 
*fname,
        sys_timeout(NO_RSP_TIMEOUT_MS, no_response, &ctx);
        while (!ctx.done) {
                net_lwip_rx(udev, netif);
-               sys_check_timeouts();
                if (ctrlc()) {
                        printf("\nAbort\n");
                        ctx.done = ABORTED;
diff --git a/net/lwip/wget.c b/net/lwip/wget.c
index ea1113e18b11..fcaf684e61da 100644
--- a/net/lwip/wget.c
+++ b/net/lwip/wget.c
@@ -525,7 +525,6 @@ int wget_do_request(ulong dst_addr, char *uri)
while (!ctx.done) {
                net_lwip_rx(udev, netif);
-               sys_check_timeouts();
                if (ctrlc())
                        break;
        }

Reply via email to