Re: [PATCH] usb: gadget: f_ncm: Restart timer when eth_start_xmit() fails
From: Francesco Lavra
Date: Thu Oct 22 2026 - 06:24:47 EST
Friendly ping
On Mon, 2026-07-27 at 18:54 +0200, Francesco Lavra wrote:
> The ncm_tx_timeout() function is run by a timer when unsent data has been
> sitting for some time in the NCM driver waiting for more data to be
> pushed
> by the ethernet gadget driver, and calls eth_start_xmit() to trigger a
> flush of the unsent data. If there is no available struct usb_request
> (which can happen when there is sustained network traffic from the gadget
> device to the USB host), the unsent data is not flushed, and remains
> there
> until enough new data has been pushed by the ethernet gadget driver to
> fill
> a USB packet. This can cause outgoing network traffic to stall for
> several
> seconds, during which the gadget device appears unresponsive to the host.
>
> Fix this issue by restarting the ncm_tx_timeout() timer if there is no
> available struct usb_request.
>
> Signed-off-by: Francesco Lavra <flavra@xxxxxxxxxxxx>
> ---
> drivers/usb/gadget/function/f_ncm.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/usb/gadget/function/f_ncm.c
> b/drivers/usb/gadget/function/f_ncm.c
> index 64eabda2f546..fd84086473d7 100644
> --- a/drivers/usb/gadget/function/f_ncm.c
> +++ b/drivers/usb/gadget/function/f_ncm.c
> @@ -1158,7 +1158,8 @@ static enum hrtimer_restart ncm_tx_timeout(struct
> hrtimer *data)
> *
> * This will call directly into u_ether's
> eth_start_xmit()
> */
> - netdev->netdev_ops->ndo_start_xmit(NULL, netdev);
> + if (netdev->netdev_ops->ndo_start_xmit(NULL, netdev) ==
> NETDEV_TX_BUSY)
> + return HRTIMER_RESTART;
> }
> return HRTIMER_NORESTART;
> }