Skip to content

Commit d68b07a

Browse files
grandwolfgregkh
authored andcommitted
can: gs_usb: fix busy loop if no more TX context is available
commit 97819f943063b622eca44d3644067c190dc75039 upstream. If sending messages with no cable connected, it quickly happens that there is no more TX context available. Then "gs_can_start_xmit()" returns with "NETDEV_TX_BUSY" and the upper layer does retry immediately keeping the CPU busy. To fix that issue, I moved "atomic_dec(&dev->active_tx_urbs)" from "gs_usb_xmit_callback()" to the TX done handling in "gs_usb_receive_bulk_callback()". Renaming "active_tx_urbs" to "active_tx_contexts" and moving it into "gs_[alloc|free]_tx_context()" would also make sense. Signed-off-by: Wolfgang Grandegger <wg@grandegger.com> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent f7d8b2e commit d68b07a

1 file changed

Lines changed: 2 additions & 8 deletions

File tree

drivers/net/can/usb/gs_usb.c

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,8 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
356356

357357
gs_free_tx_context(txc);
358358

359+
atomic_dec(&dev->active_tx_urbs);
360+
359361
netif_wake_queue(netdev);
360362
}
361363

@@ -444,14 +446,6 @@ static void gs_usb_xmit_callback(struct urb *urb)
444446
urb->transfer_buffer_length,
445447
urb->transfer_buffer,
446448
urb->transfer_dma);
447-
448-
atomic_dec(&dev->active_tx_urbs);
449-
450-
if (!netif_device_present(netdev))
451-
return;
452-
453-
if (netif_queue_stopped(netdev))
454-
netif_wake_queue(netdev);
455449
}
456450

457451
static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb, struct net_device *netdev)

0 commit comments

Comments
 (0)