mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 01:49:46 +00:00
can: gs_usb: gs_usb_xmit_callback(): fix handling of failed transmitted URBs
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: d08e973a77 ("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>
This commit is contained in:
@@ -750,8 +750,21 @@ static void gs_usb_xmit_callback(struct urb *urb)
|
|||||||
struct gs_can *dev = txc->dev;
|
struct gs_can *dev = txc->dev;
|
||||||
struct net_device *netdev = dev->netdev;
|
struct net_device *netdev = dev->netdev;
|
||||||
|
|
||||||
if (urb->status)
|
if (!urb->status)
|
||||||
netdev_info(netdev, "usb xmit fail %u\n", txc->echo_id);
|
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,
|
static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb,
|
||||||
|
|||||||
Reference in New Issue
Block a user