]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
can: gs_usb: gs_usb_xmit_callback(): fix handling of failed transmitted URBs
authorMarc Kleine-Budde <mkl@pengutronix.de>
Sat, 8 Nov 2025 09:01:01 +0000 (10:01 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Sun, 16 Nov 2025 16:03:43 +0000 (17:03 +0100)
The driver lacks the cleanup of failed transfers of URBs. This reduces the
number of available URBs per error by 1. This leads to reduced performance
and ultimately to a complete stop of the transmission.

If the sending of a bulk URB fails do proper cleanup:
- increase netdev stats
- mark the echo_sbk as free
- free the driver's context and do accounting
- wake the send queue

Closes: https://github.com/candle-usb/candleLight_fw/issues/187
Fixes: d08e973a77d1 ("can: gs_usb: Added support for the GS_USB CAN devices")
Link: https://patch.msgid.link/20251114-gs_usb-fix-usb-callbacks-v1-1-a29b42eacada@pengutronix.de
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/usb/gs_usb.c

index 69b8d6da651bf476c7efd47dedb7f395f4c02cd9..fa9bab8c89aea00a5b606ca18d4d0264b7ffc28d 100644 (file)
@@ -750,8 +750,21 @@ static void gs_usb_xmit_callback(struct urb *urb)
        struct gs_can *dev = txc->dev;
        struct net_device *netdev = dev->netdev;
 
-       if (urb->status)
-               netdev_info(netdev, "usb xmit fail %u\n", txc->echo_id);
+       if (!urb->status)
+               return;
+
+       if (urb->status != -ESHUTDOWN && net_ratelimit())
+               netdev_info(netdev, "failed to xmit URB %u: %pe\n",
+                           txc->echo_id, ERR_PTR(urb->status));
+
+       netdev->stats.tx_dropped++;
+       netdev->stats.tx_errors++;
+
+       can_free_echo_skb(netdev, txc->echo_id, NULL);
+       gs_free_tx_context(txc);
+       atomic_dec(&dev->active_tx_urbs);
+
+       netif_wake_queue(netdev);
 }
 
 static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb,